有点难。
插入排序是一个时间复杂度为O(n^2)级别的不稳定的排序算法,之所以说它的不稳定的,是因为插入排序在处理近乎有序的数组的时候,排序效率会非常快,而在处理完全无序的数组的时候,排序效率则为N平方级别。 希尔排序就是为了解决插入排序在处理完全无序的数组时效率过慢而诞生的优秀算法。
希尔排序是思想是,在插入排序的基础上,对插入数组的索引的间隔进行扩大,这个间隔大小为 gap。 gap的最小值为1,最大值为gap*3+1小于数组长度。
public class ShellSort {
/**
* 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序
*/
public static int[] shellSort(int[] array) {
int[] arr = Arrays.copyOf(array, array.length);
int gap = 1;
while (gap < arr.length) {
gap = gap * 3 + 1;
}
while (gap > 0) {
for (int i = gap; i < arr.length; i++) {
int insertValue = arr[i];
int j = i - gap;
while (j >= 0 && arr[j] > insertValue) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = insertValue;
}
gap = (int) Math.floor(gap / 3D);
}
return arr;
}
public static void main(String[] args) {
int[] arr = {2, 33, 443, 3232, 3, 33, 12, -11};
System.out.println(Arrays.toString(shellSort(arr)));
}
}