前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java常见排序算法详解——希尔排序

Java常见排序算法详解——希尔排序

作者头像
Demo_Yang
发布2019-04-18 17:05:04
4520
发布2019-04-18 17:05:04
举报
文章被收录于专栏:yang0rangeyang0range
概念:

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
  • 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
原理:
  1. 先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序
  2. 然后取 d2(d2 < d1) 重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,
  3. 最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。 列如:我们有一个数组[ 13 14 94 33 82 25 59 94 65 23 45 27 73如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列
代码语言:javascript
复制
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序

代码语言:javascript
复制
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

我们可以看到通过第一趟之后,我们得到的数组是: 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 之后,我们再以3为步长进行排序:

代码语言:javascript
复制
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后:

代码语言:javascript
复制
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后再以1位步长进行排序,这时候就是个一个简单的插入排序了。

实现代码:
代码语言:javascript
复制
    public  void sort() {
        int number = array.length / 2;
        int i;
        int j;
        int temp;
        while (number >= 1) {
            for (i = number; i < array.length; i++) {
                temp = array[i];
                j = i - number;
                while (j >= 0 && array[j] > temp) { //需要注意的是,这里array[j] > temp将会使数组从小到到排序。
                    array[j + number] = array[j];
                    j = j - number;
                }
                array[j + number] = temp;
            }
            number = number / 2;
        }
    }
算法系列:

冒泡排序

选择排序

直接插入排序

二分插入排序

希尔排序

堆排序

完整代码:

Java和Kotlin代码我均放在了GitHub上,欢迎Star!

GitHub地址:https://github.com/yang0range/MyAlgorithm

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念:
  • 原理:
  • 实现代码:
  • 算法系列:
  • 完整代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档