[Java代码] Java排序算法之——希尔排序

算法简述

希尔排序也叫作shell排序或缩小增量排序,据说是一个叫D.L.Shell的人发明出来的,顾取名shell排序。这种排序是基于插入排序思想的,也比较适用于数据量大时。


我刚开始看到时候对于插入排序也是半瓶子醋,直接导致我看不懂了,抓狂,so...我就去默默的补习一下插入排序喽。

插入排序简介

插入排序的核心思想是比较和插入,就是从第二个数开始,一次插入到前面合适的位置。排序步骤如下:

  1. 1. 首先对数组的前两个数据进行从小到大的排序
  2. 2. 接着将第3个数据与排序好的两个数据进行比较,插入合适的位置
  3. 3. 然后,将第4个数据插入已经排好的前3个数据中
  4. 4 .不断重复上述的过程,完成排序
  5. http://www.nvzi91.cn/byjc/29923.html
复制代码
代码实现
  1. private void insertSort(int[] a)
  2. {
  3. int i,j,t,h;
  4. for(i =1;i<a.length;i++)
  5. {http://www.nvzi91.cn/gongwaiyun/29927.html
  6. t = a[i];
  7. j = i-1;
  8. while(j>=0&&t<a[j])
  9. {
  10. a[j+1] = a[j];
  11. j--;
  12. }
  13. a[j+1] = t;
  14. System.out.println("第"+i+"步排序:"+Arrays.toString(a));
  15. }
  16. }
  17. http://www.nvzi91.cn/baidaiyichang/29924.html 
复制代码

简单的介绍了一下插入排序,下面就讲一下这个希尔排序。

排序步骤
  1. 1.将有n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对。。。
  2. 2.一次循环使每一个序列对排好顺序(对每个序列使用插入排序算法,实质是一种分组插入)
  3. 3.然后,再变为n/4个序列,再次排序
  4. 4.不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。
复制代码
实例讲解

比如对{12,31,11,20,17,30}进行希尔排序:

  1. 1. 第一次排序,首先将数组分为6/2=3个数字序列,第一个数据12和第四个数据20为一对,第二个数据和第五个数据为一对,第三个数据和第六个数据为一对,每一对进行排序后数据为:12,17,11,20,31,30
  2. 2. 第二次排序,将数组划分为6/4=1(这里取整),此时逐个对数据比较,按照插入排序算法进行排序,排序后的数据为:11,12,17,20,30,31
  3. http://www.kmrlyy.com/yindaoyan/dcxydy/33437.html
复制代码
代码片段
  1. private void shellSort(int[] a)
  2. {
  3. int i,j,h;
  4. int r,temp;
  5. int x = 0;
  6. for(r = a.length/2;r>=1;r/=2)
  7. {http://www.nvzi91.cn/qinggan/29926.html
  8. for(i = r;i<a.length;i++)

  9. temp = a[i];
  10. j = i -r;
  11. while(j>=0&&temp<a[j])
  12. {
  13. a[j+r] = a[j];
  14. j-=r;
  15. }
  16. a[j+r] = temp;
  17. }
    1. {http://www.nvzi91.cn/rlyby/031129925.html
  18. x++;
  19. System.out.println("第"+x+"步排序:"+Arrays.toString(a));
  20. }www.nvzi91.cn
  21. }m.nvzi91.cn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值