希尔排序

前言
- 观看本文之前最好了解插入排序,可以参考插入排序
- 排序流程
- 先取一个小于数组长度的整数n作为一个增量m,然后让整个数组分组,所有m的倍数的元素放在一个分组里,然后对各组进行插入排序。然后不断的缩小增量进行继续分组排序。知道m=1为止。
代码
public static void shellSort(int arr[]){
int gap=arr.length;
while (true){
gap=gap/2;
for(int i=0;i<=gap;i++){
//插入排序
for(int j=i+gap;j>=0 && j-gap>=0;j-=gap){
if(arr[j]<arr[j-gap]){
int temp=arr[j];
arr[j]=arr[j-gap];
arr[j-gap]=temp;
}
}
}
if(gap==1){
break;
}
}
}
复杂度分析
步长序列的不同,会导致最坏的时间复杂度情况的不同。 平均NlogN最坏O(n2)
插入排序和希尔排序比较
- 直接插入排序是稳定的;而希尔排序是不稳定的。
- 直接插入排序更适合于原始记录基本有序的集合。
- 希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。
- 直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。