文章目录

  • 1、概述
  • 2、希尔排序之交换法
  • 3、希尔排序之移动法
  • 4、测试案例

1、概述

由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率。希尔排序就是在这个基础上进行改良,让数据能在较短的移动次数内就完成排序,继而提高排序效率。

希尔排序是希尔在1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更加高效的版本,也称为缩小增量排序(不断地除2)。核心思想:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

缩小增量的核心要领:

希尔排序就是在之前的排序算法的基础上,进行了一个改良,它最本质的目的就是希望做出一些优化,使得我们的代码移动的次数减少。继而再配合我们的交换法(冒泡排序思想)和移动法(插入排序思想)。所以学习希尔排序就需要你对冒泡排序和插入排序已经熟练掌握,不然希尔排序对你来说就又是一个新的排序(本质我们只需要学会希尔排序的缩小增量思想就行)。


2、希尔排序之交换法

在缩小增量的基础上,配合冒泡排序的使用,该方法效率并不高

public class ShellSortTest01 {public static void main(String[] args) {int[] arr = {1, 123, 10, 3, 6, 34, 66, 23, 11, 71};shellSort(arr);System.out.println(Arrays.toString(arr));}public static void shellSort(int[] arr) {int temp;//1.每组的大小不断的减小为原来的一半,缩小增量的关键步骤for (int grap = arr.length / 2; grap > 0; grap /= 2) {//2.根据分出来的组数,遍历对应的每一组的其中一个元素,为下面的每一组数字的遍历开一头for (int i = grap; i < arr.length; i++) {//3.遍历每一组的数字,使用类似于冒泡的方式进行交换数据for (int j = i - grap; j >= 0; j -= grap) {if (arr[j] > arr[j + grap]) {temp = arr[j + grap];arr[j + grap] = arr[j];arr[j] = temp;}}}}}
}

3、希尔排序之移动法

在缩小增量的基础上,配合插入排序,效率较高

public class ShellSortTest02 {public static void main(String[] args) {int[] arr = {1, 123, 10, 3, 6, 34, 66, 23, 11, 71};shellSort2(arr);System.out.println(Arrays.toString(arr));}public static void shellSort2(int[] arr) {int insertVale;int insertIndex;//1.每组的大小不断的减小为原来的一半for (int grap = arr.length / 2; grap > 0; grap /= 2) {//2.根据分出来的组数,遍历对应的每一组的其中一个元素,为下面的每一组数字的遍历开一头for (int i = grap; i < arr.length; i++) {//3.遍历每一组的数字,使用插入排序的方式进行排序//其实内部就是一个插入排序,只是外面套了个缩小增量的壳insertVale = arr[i];insertIndex = i - 1;while (insertIndex >= 0 && insertVale < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];insertIndex--;}if (insertIndex + 1 != i) {arr[insertIndex + 1] = insertVale;}}}}
}

4、测试案例

最终我们的测试案例,使用希尔排序配合移动法

public class ShellSortTest03 {public static void main(String[] args) {int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 80000);}long start = System.currentTimeMillis();shellSort2(arr);System.out.println(Arrays.toString(arr));long end = System.currentTimeMillis();System.out.println("shell排序花费的时间是:" + (end - start));}public static void shellSort2(int[] arr) {//插入排序需要的变量int insertVale;int insertIndex;for (int grap = arr.length / 2; grap > 0; grap /= 2) {for (int i = grap; i < arr.length; i++) {//原始的插入排序insertVale = arr[i];insertIndex = i - 1;while (insertIndex >= 0 && insertVale < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];insertIndex--;}if (insertIndex + 1 != i) {arr[insertIndex + 1] = insertVale;}}}}
}

使用该方式的速率极快,这是在冒泡、选择、插入这三种中,最快的一种

常见排序算法之希尔排序相关推荐

  1. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

  2. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  3. [算法]-排序算法之希尔排序

    希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...

  4. 排序算法:希尔排序算法实现及分析

    希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...

  5. 排序算法之希尔排序(Java实现)

    希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...

  6. 排序算法(4)希尔排序

    排序算法(4)希尔排序 原理: 希尔排序也称缩小增量排序:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序, 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时(用gap ...

  7. php取名字算法,JavaScript排序算法之希尔排序的2个实例_基础知识

    插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位. 希尔排序按其设计者希尔(Donald Shell)的 ...

  8. 经典排序算法之希尔排序

    排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...

  9. C#排序算法之希尔排序

    前言 希尔排序是插入排序的优化,它利用了分治的思想,将需要排序的数组分为几段,在每一段中做插入排序.通过分治的思想,使得排序效率比起原来的插入排序要快了很多.对于插入排序,不了解的可以查看我之前的文章 ...

最新文章

  1. 如何记录2秒内实现1800度转体+翻腾,百度智能云黑科技教你看懂跳水
  2. 并发编程中的GIL锁(全局解释器锁)自己理解的他为啥存在
  3. did双重差分法_Stata中双重差分操流程及代码
  4. cordova 5.0版本说明
  5. 手游服务器验证,手游登录流程
  6. sql的的over不能和group by一起使用吧_CellRouter的使用
  7. hyper-v 安装centos7 后,虚拟机无法访问网络。
  8. 迷宫探索DFS(递归记录来回路径)
  9. linux apach2 内存,Apache2.2.14(Ubuntu)修改最大连接数
  10. Oracle null 处理
  11. newifi3 高恪魔改_新路由3高恪newifi3固件-支持512M
  12. 记一次结合fiddler逆向破解app注册码
  13. js获取某一天的零点时刻和某天的23:59
  14. 初等变换:矩阵与行列式
  15. 电商如何利用API接口获取商品信息数据
  16. MySQL权限系统(一).The MySQL Access Privilege System 概述
  17. WordPress博客系统搜索引擎优化seo全攻略-新华站长网
  18. 亚马逊徐霄鹏: 5000 字深度解析美团八步增长战略
  19. 弘辽科技:拼多多没出单改销量吗?拼多多如何提高销量?
  20. 非法本法硕最真实的就业现状

热门文章

  1. python mro--多继承属性查找机制
  2. pta5-4 6174黑洞
  3. 2021上海(国际)智慧物流装备及技术展览会/上海快递物流展/物流包装运输展
  4. Elmo驱动器:CANopen协议电机PVT模式的PDO映射
  5. 实变函数论学习笔记(二)集合的势
  6. 弘辽科技:如何提高免费流量
  7. 边缘检测 - Canny算子
  8. 【Android双屏异显】如何真正的实现Android双屏异显
  9. Android 实现书籍翻页效果----完结篇
  10. Windows+QtCreater+Opencv环境配置(成功运行)