希尔排序(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 }