希尔排序:希尔排序是插入排序的优化算法,算法思想:通过将全部元素分为几个区域来提升插入排序的性能。先将步长设为数组的一半,将分好的区域进行插入排序,之后步长gap每次等于他的一半,即gap /= 2。当步长为1时,就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了,插入速度快。
例如:数组 2,5,7,3,4,9,6,8,1,10
第一次gap=5 此时的分组如下,进行插入排序之后的数组 2,5,7,1,4,9,6,8,3,10
第二次gap/=2 gap=2 此时的分组如下,进行插入排序之后的数组 1,4,3,2,5,7,6,8,9,10
第三次gap /=2 gap=1 此时的分组如下,进行插入排序之后的数组 1,2,3,4,5,6,7,8,9,10
此时排序完成,希尔算法的时间复杂度为 O(n^1.5) 空间复杂度为 O(1) 不具有稳定性。
代码如下:
public static <T extends Comparable<T>> void shellSort(T[] arr){
int n = arr.length;
for (int gap=n/2;gap>0;gap/=2){
for (int i=gap;i<n;i++){
int j=i;
while(j-gap >= 0 && (arr[j].compareTo(arr[j-gap]) < 0)){
swap(arr,j,j-gap);
j-=gap;
}
}
}
}