Java 希尔排序算法

Posted 曾淘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 希尔排序算法相关的知识,希望对你有一定的参考价值。

简介

上一章我们学习了 Java 插入排序算法,这一章,我们来学习插入排序算法,so,多了不说,继续老规矩,学习内容如下:
1、希尔排序的定义
2、希尔排序的思路
3、代码实现

1.希尔排序的定义

希尔排序的实质就是:分组插入排序,它是简单插入排序经过改进之后的一个更高效的版本,又称缩小增量法

将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。

因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高

2.希尔排序的思路

简单的插入排序

  • 默认从第2个数据开始比较。如果第2个数据比第1个小,则交换。
  • 然后在用第3个数据比较,如果比前面小,则插入。否则,退出循环。
  • 说明:默认将第1数据看成有序列表,后面无序的列表循环每一个数据,如果比前面的数据小则插入(交换)。否则退出。

希尔排序

  • 基本上和插入排序一样的道理
  • 不一样的地方在于,每次循环的步长,通过减半的方式来实现
  • 说明:基本原理和插入排序类似,不一样的地方在于。通过间隔多个数据来进行插入排序。

3.代码实现

package com.gongchao.boss;

/**
 * description: 希尔排序
 * auth: zengtao
 * time: 2020-12-11 15:45
 **/
public class Main 

    public static void main(String[] args) 
        int arr[] = 9, 5, 2, 7, 4;
        // 希尔排序
        sortHill(arr);
    

    private static void sortHill(int[] arr) 
        // 希尔排序
        for (int i = arr.length / 2; i > 0; i /= 2) 
            // i层循环控制步长
            for (int j = i; j < arr.length; j++) 
                // j控制无序端的起始位置
                for (int k = j; k > 0  && k - i >= 0; k -= i) 
                    if (arr[k] < arr[k - i]) 
                        int temp = arr[k - i];
                        arr[k - i] = arr[k];
                        arr[k] = temp;
                     else 
                        break;
                    
                    // 打印排序后的数据
                    systemArr(arr);
                
            
            // j,k为插入排序,不过步长为i
        
    

    private static void systemArr(int[] arr) 
        for (int i : arr) 
            System.out.print(i + " ");
        
        System.out.println("");
    

运行结果

而一般的插入排序运行结果如下

两者对比:希尔排序,时间上很明显高效了很多 实际情况也证明了,希尔排序是高效的,大大的节约了时间


我也查阅了很多资料和文献,有这么一个说法

PS:当需要插入的数是较小的数时,后移的次数明显增多,对效率会有影响

我这边也测试了下

测试数据 2,3,4,5,6,1

运行结果

同样5个数据的情况下,链路和步的确有所拉长,也可能数据太少,不够明显,但是这个说法的确是正确的。

好了

到此为止,希尔排序已经总结完毕。

欢迎观看,Thanks !

以上是关于Java 希尔排序算法的主要内容,如果未能解决你的问题,请参考以下文章

Java 希尔排序算法

Java 快速排序算法

Java 快速排序算法

算法实战---OC希尔排序

排序算法之希尔排序(Java)

排序算法之希尔排序(Java)