1. 什么是希尔排序

  • 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
  • 因为简单插入排序有缺陷,所以提出了希尔排序

2.希尔排序的步骤

  • 希尔排序一共有两种排序方式
  • 交换法和移动法,推荐使用移动法

3.代码实现

package com.qin.sort;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};int[] arr2 = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};//shellSort(arr);//shellSort2(arr2);System.out.println("======================");//测试选择排序的速度int [] arr3 = new int[80000];for (int i = 0; i < 80000; i++) {  //创建一个数组大小为80000arr3[i] = (int)(Math.random()*80000000); //赋予随机数}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date1Str = simpleDateFormat.format(date1);shellSort2(arr3);Date date2 = new Date();String date2Str = simpleDateFormat.format(date2);System.out.println("交换式");System.out.println("执行前的时间是"+date1Str);System.out.println("执行后的时间是"+date2Str);//测试选择排序的速度int [] arr4 = new int[80000];for (int i = 0; i < 80000; i++) {  //创建一个数组大小为80000arr4[i] = (int)(Math.random()*80000000); //赋予随机数}Date date3 = new Date();String date3Str = simpleDateFormat.format(date3);shellSort3(arr4);Date date4 = new Date();String date4Str = simpleDateFormat.format(date4);System.out.println("移位式");System.out.println("执行前的时间是"+date3Str);System.out.println("执行后的时间是"+date4Str);}//使用逐步推导的方法来编写希尔排序//本质是交换排序// 8, 9, 1, 7, 2, 3, 5, 4, 6, 0// 0 1 3 7 9 ,2 4 5 6 8// 123456789public static void shellSort(int[] arr) {int temp = 0;//希尔排序的第一轮排序//因为第一轮排序,是将10个数据分成了5组for (int i = 5; i < arr.length; i++) {  // i<10//遍历各组中所有的元素(共有5组,每组2个元素),步长5for (int j = i - 5; j >= 0; j -= 5) {   //j=j-5//如果当前元素大于加上步长后的的那个元素,说明交换if (arr[j] > arr[j + 5]) {temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("希尔排序一轮过后:" + Arrays.toString(arr));//希尔排序的第二轮排序//因为第二轮排序,是将10个数据分成了 5/2 = 2组for (int i = 2; i < arr.length; i++) {//遍历各组中所有的元素(共有2组,每组5个元素),步长2for (int j = i - 2; j >= 0; j -= 2) {//如果当前元素大于加上步长后的的那个元素,说明交换if (arr[j] > arr[j + 2]) {temp = arr[j];arr[j] = arr[j + 2];arr[j + 2] = temp;}}}System.out.println("希尔排序二轮过后:" + Arrays.toString(arr));//希尔排序的第三轮排序//因为第三轮排序,是将10个数据分成了 5/2/2 = 1组for (int i = 1; i < arr.length; i++) {//遍历各组中所有的元素(共有1组,每组10个元素),步长1for (int j = i - 1; j >= 0; j -= 1) {//如果当前元素大于加上步长后的的那个元素,说明交换if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println("希尔排序三轮过后:" + Arrays.toString(arr));System.out.println("===========================================");}//希尔排序二public static void shellSort2(int[] arr) {int temp = 0;int count = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {for (int j = i - gap; j >= 0; j -= gap) {if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}//System.out.println("希尔排序第" + (++count) + "轮后" + Arrays.toString(arr));}}//对交换式希尔排序进行优化->移位法public static void shellSort3(int[] arr){//增量gap,并逐步缩小增量for (int gap = arr.length / 2; gap > 0; gap /= 2){//从第gap个元素,逐个对其所在组进行插入排序for (int i = gap; i < arr.length; i++) {int j = i;int temp = arr[i];if (arr[j]<arr[j-gap]){while (j-gap >= 0 && temp < arr[j-gap]){//移动arr[j] = arr[j-gap];j-=gap;}//当退出while后,就给temp找到了插入的位置arr[j] = temp;}}}}}

结果


得出结论

  • 希尔排序的次数n等于 2^n < 数组个数 ,n为小于的最大值
  • 交换式的时间要比插入式的时间长

12. 希尔排序,以及希尔排序的优化相关推荐

  1. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  2. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  3. 希尔排序python 简书_排序:希尔排序(算法)

    文 | 莫若吻 (注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助.) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩 ...

  4. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  5. shell按照时间排序_【经典排序】希尔排序

    希尔排序 简介: 希尔排序,英文Shell's sort,是一位叫D.L.Shell的老哥在1959就提出来的算法,是<插入排序>的一种又称"缩小增量排序"(Dimin ...

  6. [C语言] 插入排序之希尔(shell)排序的特性及实现

    [C语言] 插入排序之希尔(shell)排序的特性及实现 1.算法特性 希尔排序法又称缩小增量法,由直接插入排序改进而来,是一种不稳定的插入排序方法.其本质上是一种分组排序方法,不需要大量的辅助空间, ...

  7. 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)

    1.排序算法 1.排序的分类 分为内部排序和外部排序,其中内部排序分为插入排序.选择排序.交换排序.归并排序和基数排序.插入排序包括直接插入排序和希尔排序:选择排序包括简单选择排序和堆排序:交换排序包 ...

  8. 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

    目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...

  9. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

  10. 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较

    掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...

最新文章

  1. 简单粗暴上手TensorFlow 2.0,北大学霸力作,必须人手一册!
  2. setup_cuda.py 编译gpu_nms
  3. 函数式编程语言python-Python自动化开发 - 函数式编程
  4. ASP.NET制作一个简单的等待窗口
  5. C#+Sql数据库备份
  6. python客户端和服务端实验_结合服务器和客户端python
  7. 为什么HashMap会产生死循环?
  8. 我很想走到一个森林里旅游
  9. 线上故障快速定位及恢复
  10. java服务器项目,java项目服务器部署
  11. 【面试题】百度糯米java工程师面试
  12. 升级mac系统正在计算机,Mac升级卡死解决办法
  13. 《电路原理》清华公开课 week1 支路变量、元件、KCL、KVL
  14. Ubantu18.04
  15. 《斯坦福高效睡眠法》读书笔记思维导图版,成年人的睡眠解决法
  16. TcaplusDB君 · 行业新闻汇编(12月20号)
  17. php 答题 一页一题,微信小程序答题,怎么设计页面渲染,答完一题,跳到下一题...
  18. excel取html文本长度,excel字符长度 怎么计算excel里的字符串的长度
  19. 电赛A题无线运动传感节点总结(一)
  20. 安卓手机作为文件共享服务器,如何设置电脑使安卓手机能访问局域网共享的文件...

热门文章

  1. ASEMI整流桥MBS家族的MB6S为何比MB10S还出名
  2. 2019年全国省市区代码Oracle数据库脚本
  3. CAD多行文字快捷键是什么?怎么用?
  4. 爬虫怎么根据一个关键词爬取上千张网络图片
  5. Linux--进程和计划任务管理 理论干货+实操(程序,进程,线程之间关系的详解,静态与动态查看进程方式,控制进程的 方式,一次性任务与周期性任务的设置)
  6. 查询微信号被谁投诉封方法
  7. 【Java】接口的讲解与使用,你还有要补充的嘛?
  8. apt-get安装问题:请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
  9. PLC信号处理之平均值滤波(SMART PLC指针应用)
  10. SOPHGO SE5微服务器的连接配置方法及IP查看修改