活动地址:CSDN21天学习挑战赛
目录
一、基本思想
二、希尔排序的过程
三、增量的确定
四、实例
五、时间性能分析
一、基本思想
将整个待排记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列中的记录基本有序时,对全体记录进行直接插入排序。
二、希尔排序的过程
相同的颜色为一组,组内使用直接插入排序。
三、增量的确定
将相隔某个“增量”的记录组成一个子序列
d1=n/2,di+1=d/2;
算法描述
for(d=n/2;d>=1;d=d/2){
以d为增量,进行组内直接插入排序;}
四、实例
输入:4 32 12 8 10 24 2 6 68 36
使用希尔排序,输出希尔排序每趟的排序结果和最终的排序结果
代码:
int main(){
int a[11];
int k,d,i,j;
for(k=1;k<=10;k++){
cin>>a[k];}
for(d=5;d>=1;d=d/2){//改变增量d,分割待排序列
for(i=d+1;i<=10;i++){//子序列直接插入排序
a[0]=a[i];
j=i-d;
while(j>0&&a[0])<a[j]){
a[j+d]=a[j];
j=j-d;}
a[j+d]=a[0];}
printf("d=%d的排序结果:",d);
for(k=1;k<=10;k++){
cout<<a[k]<<" ";}
cout<<endl;}
cout<<"最终的排序结果:";
for(k=1;k<=10;k++){
cout<<a[k]<<" ";}
return 0;}
运行结果:
五、时间性能分析
希尔排序开始时增量较大,每个子序列中的记录个数较少,从而排序速度较快;当增量减少,每个子序列的记录个数较多,但整个序列已基本有序,所以排序速度也比较快。
当n在某个确定的范围内时,希尔排序所需的比较次数和记录的移动次数约为O(n^1.3)。