希尔排序

来源:互联网 发布:新版淘宝没有摇一摇 编辑:程序博客网 时间:2024/06/11 19:09

参考自:

http://blog.csdn.net/morewindows/article/details/6668714

1、算法思路

由于插入排序对于大体上已排好序的数组具有很高的效率,希尔排序的思路就是以不同的gap将整个数组分组,分别对这几组进行插入排序。实现大体上排好序,最后来一次直接插入排序。

以下面数组为例,
6 1 2 8 10 4 3 9 5 7

(1)先令gap=10(数组长)/2=5,步长相隔5的数分为一组

先以下面加粗部分为一组,进行插入排序
6 1 2 8 10 4 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7

然后接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7

接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 8 10 6 3 9 5 7

再接着对下一组(加粗部分),进行插入排序
4 1 2 8 10 6 3 9 5 7
得到
4 1 2 5 10 6 3 9 8 7

最后对此轮的最后一组(加粗部分),进行插入排序
4 1 2 5 10 6 3 9 8 7
得到
4 1 2 5 7 6 3 9 8 10

(2)再令gap=gap/2=2,步长相隔2的数分为一组

则对下面加粗部分进行插入排序
4 1 2 5 7 6 3 9 8 10
得到
2 1 3 5 4 6 7 9 8 10

接着是下一组(加粗部分)进行插入排序
2 1 3 5 4 6 7 9 8 10
得到
2 1 3 5 4 6 7 9 8 10
gap=2的就完成了

(3)再令gap=gap/2=1,步长相隔1的数分为一组,即整个数组

则对整个数组进行插入排序
2 1 3 5 4 6 7 9 8 10
得到
1 2 3 4 5 6 7 8 9 10

(4)以上就完成了

2、核心代码

int shellSort(int *data, unsigned int length){    if (data == NULL)    {        return -1;    }    //分不同的gap    for (int gap = length/2; gap > 0;gap=gap/2)    {        //在同一gap中分组        for (int i = 0; i < gap; i++)        {            //遍历在同一组中的数据            for (int j = i+gap; j < length; j=j+gap)            {                int temp = data[j];                int k = j - gap;                while (k>=0&&data[k]>temp)                {                    data[k + gap] = data[k];                    k = k - gap;                }                data[k + gap] = temp;            }        }    }    return 0;}

3、Test代码

#include<iostream>#include<string>using namespace std;int shellSort(int *data, unsigned int length);void main(void){    int array[10] = {6,1,2,8,10,4,3,9,5,7};    int num = 10;    //step1: 遍历数组,输出初始排列    for (int arN = 0; arN < num; arN++)    {        cout << array[arN]<<' ';    }    cout << endl;    //step2: 希尔排序    shellSort(array, num);    //step3: 遍历数组,输出排序后结果    for (int arN = 0; arN < num; arN++)    {        cout << array[arN]<<' ';    }}int shellSort(int *data, unsigned int length){    if (data == NULL)    {        return -1;    }    //分不同的gap    for (int gap = length/2; gap > 0;gap=gap/2)    {        //在同一gap中分组        for (int i = 0; i < gap; i++)        {            //遍历在同一组中的数据            for (int j = i+gap; j < length; j=j+gap)            {                int temp = data[j];                int k = j - gap;                while (k>=0&&data[k]>temp)                {                    data[k + gap] = data[k];                    k = k - gap;                }                data[k + gap] = temp;            }        }    }    return 0;}

4、运行结果

希尔排序Test程序运行结果

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 改了无线网密码还是上不去网怎么办 买的京东e卡丢了怎么办 已认证未抵扣的发票发生退货怎么办 办的消费卡不给退怎么办 银行卡密码忘了手机号也换了怎么办 公务卡在当当购物的刷卡单怎么办 杭州市网签提示住宅均价异常怎么办 吃鸡账号没有绑定手机就买了怎么办 微信绑定的银行卡密码错误怎么办 淘宝单张券已领取达上限怎么办 去办公室给领导送礼总有人怎么办 招行信用卡临时额度到期后怎么办 中银e令不想用了怎么办 中银e令密码忘了怎么办 银行卡预留手机号改了支付宝怎么办 手机一直收到支付验证码短信怎么办 微信绑定银行卡手机号码换了怎么办 银行卡网银登录输错密码锁了怎么办 中行信用卡主付卡的付卡怎么办停 在苏宁网购的移动空调要退货怎么办 单位发的购物卡掉了怎么办 支付宝ofo退押金后余额怎么办 e招贷分期多还了怎么办 别人用我的手机号贷款不还怎么办 电脑文件夹怎么设密码忘记了怎么办 苹果手机id有分机和主机怎么办 绝地求生号被盗了邮箱被改了怎么办 微信邮箱怎么接收不到验证码怎么办 要申请一个特定的qq邮箱号怎么办 中银e贷额度为0怎么办 中银e贷被冻结了怎么办 中国银行e贷款填错了被拒怎么办 中银e贷逾期2天怎么办 大学生助学贷款网站密码忘了怎么办 乳晕毛囊挤压捏起来有小硬节怎么办 手机版模拟人生孕妇任务卡死怎么办 百度网盘的表格没保存怎么办 爱奇艺买的会员不小心删了怎么办 多次举报和拉黑克隆不了好友怎么办 货车把货拉到货主不付钱怎么办 中国银行网银公司用户名忘了怎么办