每日编程13之希尔排序

核心思想是,分组插入排序,减小组间元素的距离,当距离为1时排序完成;



写程序的要点还是循环控制

首先,距离变量gap,初始为4依次减半2,1.

对于gap=4的情况,就有四个分组(0,0+gap,...),(1,1+gap,...)(2,2+gap,...),(3,3+gap,...)即每个分组初始分别为0~gap-1

对于gap=2的情况


在每个分组的元素序列确定后,对每个分组进行插入排序

插入排序都这么繁琐,理清思路!

对于一组元素序列来说,首先设第一个元素是最小值,从下一个元素直到序列的最后一个元素(对于每个元素,一次和序列前的元素逐个对比,若大于某个序列元素k,则其最终的位置就是k+1,并且k+1及其之后的元素都右移一位)

这,循环控制还是要加强练习

插入排序的核心是,从当前元素的上一个元素开始直到序列的第一个元素结束,依次与当前元素进行对比,确定当前元素的最终位置

存在三种情况

(1)A[cur]>A[cur-1]    

(2)A[cur]<A[0]      

(3)在中间的某个位置上

也就是说,需要依次对比直到找到一个A[j]比A[cur]不大的元素,A[cur]放在它后面。。。如果到A[0]还未找到,则说明A[cur]应该放在A[0]的位置



int swapArray(float A[],int cur,int final,int gap)
{
        if(cur==final+gap)      return 0;
        int i;
        float temp = A[cur];
        for(i=cur-gap;i>final;i-=gap)
                A[i+gap]=A[i];
        A[final+gap]=temp;
}


int shellSort(float A[],int n)
{
        int gap;
        for(gap=4;gap>=1;gap/=2)
        {
                int head;
                for(head=0;head<gap;head++)
                {
                        int i;
                        int j;
                        for(i=head+gap;i<n;i+=gap)
                        {
                                for(j=i-gap;j>=head;j-=gap)
                                        if(A[i] > A[j]) break; //我晕,竟然在这里转不过弯了,玩彩票玩久了,好逸恶劳,理智都不清醒了
                                swapArray(A,i,j,gap);


                        }
                }
        }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值