希尔排序

来源:互联网 发布:小旭音乐 知乎 编辑:程序博客网 时间:2024/05/29 08:07
插入排序的算法复杂度为O(n2),但如果序列为正序可提高到O(n),而且直接插入排序算法比较简单,希尔排序利用这两点得到了一种改进后的插入排序。

一. 算法描述
希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 d[1] > d[2] > d[3] >..> d[t] = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1;
下图详细讲解了一次希尔排序的过程:



二. 算法分析

平均时间复杂度:希尔排序的时间复杂度和其增量序列有关系,这涉及到数学上尚未解决的难题;不过在某些序列中复杂度可以为O(n1.3);

空间复杂度:O(1)  

稳定性:不稳定
三. 算法实现
[cpp] view plain copy

    /********************************************************
    *函数名称:ShellInsert
    *参数说明:pDataArray 无序数组;
    *          d          增量大小
    *          iDataNum为无序数据个数
    *说明:    希尔按增量d的插入排序
    *********************************************************/  
    void ShellInsert(int* pDataArray, int d, int iDataNum)  
    {  
        for (int i = d; i < iDataNum; i += 1)    //从第2个数据开始插入  
        {  
            int j = i - d;  
            int temp = pDataArray[i];    //记录要插入的数据  
            while (j >= 0 && pDataArray[j] > temp)    //从后向前,找到比其小的数的位置  
            {  
                pDataArray[j+d] = pDataArray[j];    //向后挪动  
                j -= d;  
            }  
      
            if (j != i - d)    //存在比其小的数  
                pDataArray[j+d] = temp;  
        }  
    }  
      
    /********************************************************
    *函数名称:ShellSort
    *参数说明:pDataArray 无序数组;
    *          iDataNum为无序数据个数
    *说明:    希尔排序
    *********************************************************/  
    void ShellSort(int* pDataArray, int iDataNum)  
    {  
        int d = iDataNum / 2;    //初始增量设为数组长度的一半  
        while(d >= 1)  
        {  
            ShellInsert(pDataArray, d, iDataNum);  
            d = d / 2;    //每次增量变为上次的二分之一  
        }  

    }


http://blog.csdn.net/cjf_iceking/article/details/7951481

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办 江西银行网银密码忘了怎么办 广发信用卡网银密码忘了怎么办 刚注册的淘宝账号买不了东西怎么办 隐藏后的wif不知道用户名怎么办 脊柱侧弯术后钢钉断了一根怎么办 对法院执行裁定申请复议过期怎么办 自己家店名被别人注册了商标怎么办 有人去工商局投诉我公司了怎么办 急用钱怎么办啊有没有什么贷款啊 初级会计报名信息表没打印怎么办 电工证复审流程时间过了怎么办 应版权方要求无法下载的电影怎么办 手机设置蜜码小孩都能破解该怎么办 拍到了上海车牌不想买车了怎么办 买车4s店不给临时车牌怎么办 百度云谣绑定的邮箱被绑定了怎么办 百度网盘分享的视频打不开怎么办 在赶集网登录时忘记验证码该怎么办 支付宝绑定的手机号是空号了怎么办 微信聊天后电话号码重复是怎么办 老婆在外省工作不回到我身边怎么办 知道扣扣号怎样盗取他的密码怎么办 喜欢养猫又怕猫破坏家里怎么办 约她她每次都找借口怎么办? 遇到总是找借口不还钱的人怎么办 装修好了业主找借口不给钱怎么办 荒野行动手机换了帐号登不上怎么办 换新手机后微信头像都没有了怎么办 苹果系统维护换不了微信头像怎么办 系统通知栏不显示qq图标怎么办 快递号码写错了而且发货了怎么办 包裹遗忘在郑州东站安检口了怎么办 锁书包的锁头钥匙全掉了怎么办 平板电脑恢复出厂设置变英语怎么办 给国外银行汇款账号写错账号怎么办 顺丰快递暴力运输产品坏了怎么办 亚航订机票名字少写一个字母怎么办