希尔排序

希尔排序(Java)

声明:文章参考https://blog.csdn.net/weixin_49561445/article/details/114830602

一、原理

希尔排序是基本插入排序的升级优化版,希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

希尔排序图解

 

二、时间复杂度(不稳定)

  时间复杂度约为O(n1.3)

三、代码实现(希尔插入排序)

 1 /**
 2      * 希尔排序,选择一个间隔,然后进行比较交换
 3      */
 4     public static void sort(int[] arr) {
 5         //初始化一个间隔
 6         int interval = 1;
 7         System.out.println("arr.length/3 = " + arr.length/3);
 8         //计算最大间隔
 9         while (interval < arr.length / 3) {
10             interval = interval * 3 + 1;
11         }
12         System.out.println("间隔 = " + interval);
13         int n = 0;
14         while(interval > 0) {
15             //进行插入排序
16             int tmp = 0;
17             for (int i = interval; i < arr.length; i++) {
18                 tmp = arr[i];
19                 int j = i;
20                 while (j > interval - 1 && arr[j - interval] >= tmp) {
21                     arr[j] = arr[j - interval];
22                     j -= interval;
23                     n++;
24                 }
25                 arr[j] = tmp;
26             }
27             //减少间隔
28             interval = (interval - 1) / 3;
29         }
30         System.out.println("循环次数:" + n);
31     }
32 
33     @Test
34     public void shellSort(){
35         int[] arr = new int[15];
36         for (int i = 0; i < arr.length; i++) {
37             arr[i] = (int) (Math.random()*100);
38         }
39         System.out.println("------原始数据------\n"+
40                 Arrays.toString(arr));
41         sort(arr);
42         System.out.println("------排序结果-------");
43         System.out.println(Arrays.toString(arr));
44     }
原文地址:https://www.cnblogs.com/xiayiLL/p/15652714.html