排序算法 —— 希尔排序(图文超详细)

这篇具有很好参考价值的文章主要介绍了排序算法 —— 希尔排序(图文超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


排序算法:

1、直接插入排序

2、选择排序

3、堆排序

排序算法 —— 希尔排序(图文超详细)

希尔排序(直接插入排序的优化)

希尔排序是将数据分组,将每一组进行插入排序。
每一组排成有序后,最后整体就变有序了。

排序算法 —— 希尔排序(图文超详细)

1.分组思想

排序算法 —— 希尔排序(图文超详细)
上图中gap为5,说明要分成5组。
这5组分别用了五种颜色的线条连接起来了。

第1组:9、4
第2组:1、8
第3组:2、6
第4组:5、3
第5组:7、5

为什么要采取上面的分组方法呢?换一种方法可以吗?
例如:挨着的元素分为一组。
排序算法 —— 希尔排序(图文超详细)

如果是上面的这种分组方式的话,排序之后会变成下面的情况。

排序算法 —— 希尔排序(图文超详细)

如果是最开始的分组方法的话
排序算法 —— 希尔排序(图文超详细)
如果是按照最开始的分组思想分组的话,最后会排序成
排序算法 —— 希尔排序(图文超详细)
可以发现左边都是叫小的数据,右边都是较大的数据。
更方便把分成的每一个组进行插入排序。

2.缩小增量的过程

前面gap为5的情况排序后会变成下面情况

排序算法 —— 希尔排序(图文超详细)
按照gap把数据分成了两组。

当数据很大的时候,数据的间隔很大。
小的数据会往前方,大的数据会往后放。

gap会逐渐缩小,间隔也会逐渐缩小。

整体的数据会更加趋于有序,这个时候使用直接插入排序效率会更高。



gap为2的时候会排序成下面情况
排序算法 —— 希尔排序(图文超详细)
此时分为了1组,再排序一次后变成下面情况
排序算法 —— 希尔排序(图文超详细)
此时的数据即为有序的。

3.排序步骤

3.1 排序五组数据的情况

  1. gap为5,将数据分为5组,图中红色线画中的为第一组。定义一个 i 变量指向这一组的第二个数据,定义一个 j 变量指向 i - gap 的位置。排序算法 —— 希尔排序(图文超详细)
  2. 将 i 下标的值放到定义的 tmp 中,然后与 j下标 的值比较。
    若 j 下标的值较大,将 j 下标的值放到 j + gap 的位置。
    排序算法 —— 希尔排序(图文超详细)
    执行后:
    排序算法 —— 希尔排序(图文超详细)
  3. j 变量向 j - gap 位置走,若这个位置的下标为负数。
    则要将 tmp 的值放到 j + gap的位置。
    排序算法 —— 希尔排序(图文超详细)
    j 变量此时在-5下标处,要将 tmp 的值放到 j + 5的位置。
    排序算法 —— 希尔排序(图文超详细)
    这一组数据此时为有序了。
    排序下一组数据,**i++**即可,j 变量依然是在 i - gap 的位置。
    后面4组数据类似,不在演示。
    最终排序结果是:
    排序算法 —— 希尔排序(图文超详细)

3.2 排序两组数据的情况

  1. 此时 gap 为2,数据此时分为了两组。第一组由红色线画出(4、2、5、8、5),第二组由蓝色线画出(1、3、9、6、7)。
    i 变量指向这一组的第二个数据, j 变量指向 i - gap 的位置。
    排序算法 —— 希尔排序(图文超详细)

  2. 将 i 下标的值放到定义的 tmp 中,然后与 j下标 的值比较。
    若 j 下标的值较大,将 j 下标的值放到 j + gap 的位置。
    排序算法 —— 希尔排序(图文超详细)
    执行后:
    排序算法 —— 希尔排序(图文超详细)

  3. j 变量向 j - gap 位置走,若这个位置的下标为负数。
    则要将 tmp 的值放到 j + gap的位置。
    排序算法 —— 希尔排序(图文超详细)
    j 变量此时在-2下标处,要将 tmp 的值放到 j + 2的位置。
    排序算法 —— 希尔排序(图文超详细)
    这一组数据中的 2 和 4 此时为有序了。
    排序下一组数据,i++ 即可,j 变量依然是在 i - gap 的位置。
    后面剩下的数据类似,不在演示。
    最终排序结果是:
    排序算法 —— 希尔排序(图文超详细)

3.3 排序一组数据的情况

  1. i 变量指向第二个数据, j 变量指向 i - gap 的位置。
    排序算法 —— 希尔排序(图文超详细)
  2. 将 i 下标的值放到定义的 tmp 中,然后与 j下标 的值比较。
    若 j 下标的值较大,将 j 下标的值放到 j + gap 的位置。
    排序算法 —— 希尔排序(图文超详细)
    执行后:
    排序算法 —— 希尔排序(图文超详细)
  3. j 变量向 j - gap 位置走,若这个位置的下标为负数。
    则要将 tmp 的值放到 j + gap的位置。
    排序算法 —— 希尔排序(图文超详细)
    j 变量此时在-1下标处,要将 tmp 的值放到 j + 1的位置。
    排序算法 —— 希尔排序(图文超详细)
    此时 前两个数据有序了,后面的数据排序过程类似。
    排序下一组数据,i++ 即可,j 变量依然是在 i - gap 的位置。
    最终结果是:
    排序算法 —— 希尔排序(图文超详细)

4.代码分析

4.1 如何设置数据组数

  1. 定义 gap 将数组的长度赋值给这个变量。
int gap = array2.length;//为数组的长度 - 为10
  1. 设置循环,每次使 gap 除以2来得到5、2、1三个组。
  2. 在循环内部调用直接插入排序方法。
 while (gap > 1) {
     gap /= 2;//先是分成了5组,然后是2组,再是1组
     shell(array2, gap);//调用直接插入排序方法
 }

4.2 直接插入排序实现思路

  1. 遍历数组,i 变量从 gap 下标位置开始
for (int i = gap; i < array2.length ; i++){
}
  1. j 变量从 i- gap 位置开始
  int j = i - gap;
  1. j 变量要每次减去 gap 个位置,j 此时的位置要是负数就比较 j 和 tmp 的值。
for (; j >= 0; j-=gap){
}
  1. j 和 tmp 如何比较
 if (array2[j] > tmp) {
     //j下标的值大,将j下标的值放到j变量加上一个gap的位置上
     array2[j + gap] = array2[j];
 }else {
     //j下标的值较小,j下标的值要直接放到j变量加上一个gap的位置上
     break;
 }
  1. j 下标为负数的情况
 //此时j下标的值是负数了,将tmp的值放到j变量加上一个gap的位置上
 array2[j + gap] = tmp;

更加详细的直接插入排序讲解请参考我的另一篇文章。

排序算法 —— 希尔排序(图文超详细)
文章链接:http://t.csdn.cn/rBDzh

5. 整体代码实现

 public static void shellSort(int[] array2) {
     int gap = array2.length;//为数组的长度 - 为10
     while (gap > 1) {
         gap /= 2;//先是分成了5组,然后是2组,再是1组
         shell(array2, gap);//调用直接插入排序方法
     }
 }

 //实现直接插入排序方法
 public static void shell(int[] array2, int gap) {
     //i下标从第一组的第二个数据开始
     for (int i = gap; i < array2.length ; i++) {
         int tmp = array2[i];//tmp存放i下标的值
         int j = i - gap;//j下标为i-gap个位置
         //j每次-gap个位置
         for (; j >= 0; j-=gap) {
              if (array2[j] > tmp) {
                //j下标的值大,将j下标的值放到j变量加上一个gap的位置上
                array2[j + gap] = array2[j];
              }else {
                 //j下标的值较小,j下标的值要直接放到j变量加上一个gap的位置上
                 break;
              }
          }
          //此时j下标的值是负数了,将tmp的值放到j变量加上一个gap的位置上
          array2[j + gap] = tmp;
      }
 }

排序算法 —— 希尔排序(图文超详细)文章来源地址https://www.toymoban.com/news/detail-447369.html

到了这里,关于排序算法 —— 希尔排序(图文超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包