希尔排序也是基于插入排序的一种策略,两个代码相似
插入排序:
#include <stdio.h>
int main(){
int a[]={1,10,5,3,8,0};
for(int i=1;i<6;i++){
int temp=a[i],j=i;
while(j>=1&&temp<a[j-1]){
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
for(int i=0;i<6;i++){
printf("%d ",a[i]);
}
return 0;
}
原始希尔排序(增量为D/2):
#include <stdio.h>
int main(){
int a[7]={5,7,3,0,1,2,10};
for(int D=7/2;D>0;D=D/2){ //定义增量
for(int i=D;i<7;i++){//插入希尔排序,间隔数为 D
int temp=a[i];
int j=i;
while(j>=D&&temp<a[j-D]){ //这里j>=D,并不是j>0
a[j]=a[j-D];
j=j-D;
}
a[j]=temp;
}
}
for(int i=0;i<7;i++){
printf("%d ",a[i]);
}
return 0;
}
希尔排序坏的情况:
1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 | 15 | 8 | 16 |
你会发现8间隔,4间隔,2间隔,排序顺序都没有发生变化,只能到1间隔时,才发生了变化。
原因:增量元素不互质(相邻元素没有公因子)。
提供更多的增量序列:
1)Hibbard增量序列:D=2^k-1
2)Sedgewick增量排序