思维导图:
希尔排序的定义:
普通的插入算法正序时时间复杂度会很小,但是逆序时时间复杂度会很高,为了解决这个问题,产生了希尔排序
先将整个排序表分成d个子表分别排序,然后再对全体直接插入排序
每个子表经过一次排序之后未必是有序的,只是比初始子表序列更接近有序
第一趟:
第二趟:
第三趟:
例:
希尔排序d的选取:
每次对半取
希尔排序的代码实现:
void ShellSort(int a[],int n){
int j;
for(int dk = n/2;dk >= 1;dk = dk / 2 ) //每趟希尔排序的步长d
for(int i=dk+1;i<=n;i++) //对所有的组一起直接插入排序
if(a[i] < a[i-dk]){
a[0] = a[i];
for(j=i-dk;j>0&&a[0]<a[j];j-=dk) //判断后移
a[j+dk] = a[j];
a[j+dk] = a[0];
}//if
}
int main(){
int i;
int a[5] = {NULL,3,9,6,8};
ShellSort(a,4);
for(i=1;i<5;i++)
printf("%d\t",a[i]);
}
希尔排序的性能:
时间复杂度: O(n2) (在某些情况他的时间复杂度可以为O(n^1.3))
空间复杂度: O(1)
不稳定
适用于顺序存储 (对数组下标进行操作)