1. 直接插入排序算法适用于基本有序的排序表和数据量不大的排序表。希尔排序有称之为缩小增量排序。
2. 下面这个视频分析的很详细
https://www.bilibili.com/video/BV14r4y1F71a?p=66
3. 希尔排序代码
1 package cn.sun.it.review; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class ShellSort { 7 8 public static void main(String[] args) { 9 // 测试数据:5,3,6,2,1,9,4,8,7 10 System.out.println("请输入若干个整数,以逗号分隔:"); 11 Scanner sc = new Scanner(System.in); 12 String strNums = sc.nextLine(); 13 String[] tempArrNums = strNums.split(","); 14 int[] arr = new int[tempArrNums.length]; 15 for (int i = 0; i < arr.length; i++) { 16 arr[i] = Integer.valueOf(tempArrNums[i]); 17 } 18 System.out.println("排序前:" + Arrays.toString(arr)); 19 shellSort(arr); 20 System.out.println("排序后:" + Arrays.toString(arr)); 21 } 22 23 // 插入排序之希尔排序 24 private static void shellSort(int[] arr) { 25 int temp; 26 for(int gap=arr.length/2;gap>0;gap/=2){ 27 for(int i = gap;i<arr.length;i++){ 28 temp = arr[i]; 29 int j; 30 for(j=i;j>=gap && arr[j-gap]>temp;j-=gap){ 31 arr[j] = arr[j-gap]; 32 } 33 arr[j] = temp; 34 } 35 } 36 } 37 38 }
4. 希尔排序性能
(4.1)空间复杂度:仅适用了常量个辅助单元,空间复杂度为O(1);
(4.2)由于希尔排序的时间复杂度依赖于增量序列的函数,这涉及数学上尚未解决的难题,所以其时间复杂度分析比较困难。当n在某个特定范围是,希尔排序的时间复杂度约为O(n1.3),最坏情况下希尔排序时间复杂度为O(n2)
(4.3)稳定性:不稳定