希尔排序是插入排序的一个变种排序算法,由D.L.Shell在1959年提出,所以命名为希尔排序。
插入排序是一个时间复杂度为O(n^2)级别的不稳定的排序算法,之所以说它的不稳定的,是因为插入排序在处理近乎有序的数组的时候,排序效率会非常快,而在处理完全无序的数组的时候,排序效率则为N平方级别。
希尔排序就是为了解决插入排序在处理完全无序的数组时效率过慢而诞生的优秀算法。
希尔排序是思想是,在插入排序的基础上,对插入数组的索引的间隔进行扩大,这个间隔大小为 h。
h的最小值为1,最大值为h*3+1小于数组长度。
- 希尔排序(Java实现)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17private static void shellsort(int[] arr) {
int h = 1;
while((h*3+1) < arr.length) {
h = h*3+1;
}
while(h > 0) {
for(int i = h; i < arr.length; i++) {
int insertValue = arr[i];
int j = i;
for(j = i; j > h-1 && arr[j-h] > insertValue; j = j-h ) {
arr[j] = arr[j-h];
}
arr[j] = insertValue;
}
h = (h-1)/3;
}
}