简单插入排序存在的问题

我们看简单的插入排序可能存在的问题.
数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:

  1. {2,3,4,5,6,6}
  2. {2,3,4,5,5,6}
  3. {2,3,4,4,5,6}
  4. {2,3,3,4,5,6}
  5. {2,2,3,4,5,6}
  6. {1,2,3,4,5,6}

结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.

希尔排序法介绍

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

希尔排序法基本思想

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

希尔排序法示意图


希尔排序法应用实例:

有一群小牛, 考试成绩分别是 {8,9,1,7,2,3,5,4,6,0} 请从小到大排序. 请分别使用

  1. 希尔排序时, 对有序序列在插入时采用交换法, 并测试排序速度.
  2. 希尔排序时, 对有序序列在插入时采用移动法, 并测试排序速度

代码

package 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};shellSort(arr);System.out.println(Arrays.toString(arr));*///希尔排序测速int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 80000);// 生成一个0-80000的数据}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date1Str = simpleDateFormat.format(date1);System.out.println("排序前的时间为:" + date1Str);shellSort(arr);Date date2 = new Date();String date2Str = simpleDateFormat.format(date2);System.out.println("排序后的时间为:" + date2Str);}//根据前面的逐步分析,使用循环处理// 希尔排序交换法public static void shellSort1(int[] arr) {int temp = 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;}}}}}// 对交换式的希尔排序进行改进 →→→→ 移位法public static void shellSort(int[] arr) {// 仍然使用增量gap,并逐步缩小增量for (int gap = arr.length / 2; gap > 0; gap /= 2) {// 从第gap个元素开始,逐个对其所在的组进行直接插入for (int i = gap; i < arr.length; i++) {if (arr[i] < arr[i - gap]) {int j = i;int temp = arr[j];while (j - gap >= 0 && temp < arr[j - gap]) {// 移动arr[j] = arr[j - gap];j -= gap;}// 当退出while循环后,给temp找到插入位置arr[j] = temp;}}}}// 使用逐步推导的方式编写希尔排序public static void shellSort2(int[] arr) {// 希尔排序第1轮排序// 思路:// 因为第1轮排序,将10个数据分成了5组int temp = 0;for (int i = 5; i < arr.length; i++) {// 遍历各组中所有的元素(共有5组,每组有2个元素),步长是5for (int j = i - 5; j >= 0; j -= 5) {// 如果当前元素大于加上步长后元素,说明需要交换if (arr[j] > arr[j + 5]) {temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("希尔排序第1轮结果:" + Arrays.toString(arr));// 希尔排序第2轮排序for (int i = 2; i < arr.length; i++) {// 遍历各组中所有的元素(共有5组,每组有2个元素),步长是5for (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("希尔排序第2轮结果:" + Arrays.toString(arr));// 希尔排序第3轮排序for (int i = 1; i < arr.length; i++) {// 遍历各组中所有的元素(共有5组,每组有2个元素),步长是5for (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("希尔排序第3轮结果:" + Arrays.toString(arr));}
}

Java编程:排序算法——希尔排序相关推荐

  1. 经典排序算法 - 希尔排序Shell sort

    经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第 ...

  2. python排序算法——希尔排序(附代码)

    python排序算法--希尔排序 文章目录 python排序算法--希尔排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法 ...

  3. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 排序算法——希尔排序的图解、代码实现以及时间复杂度分析

    希尔排序(Shellsort) 希尔排序是冲破二次时间屏障的第一批算法之一. 希尔排序通过比较相距一定间隔的元素来工作:各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.由 ...

  5. 排序算法---希尔排序(java版)

    希尔排序 原理 先将待排序表分割成若干相隔某个"增量"的记录组成一个子表,对各个子表分别进行直接插入,当整个表中的元素已成基本有序是,再对全体记录进行一次直接插入排序.希尔排序主要 ...

  6. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

  7. 希尔排序是一种稳定的排序算法_排序算法—希尔排序

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

  8. 排序算法——希尔排序

    希尔排序是1959 年由D.L.Shell提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录&q ...

  9. 排序算法——希尔排序(缩小增量排序)

    1.希尔排序思想: 希尔排序就是把数据分成若干份子序列,从第一个元素开始,和每间隔为n的元素分成一个子序列,对每一份子序列实行直接插入排序,然后合并成一个新序列,继续对新序列以间隔m分成若干份,继续重 ...

  10. ds排序--希尔排序_排序算法 - 希尔排序分析及优化

    希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...

最新文章

  1. Spark之SQL解析(源码阅读十)
  2. C语言实现链式栈(LinkStack)
  3. JavaScript对象this指向(普通键this指向 非指向函数的键)
  4. 求解迷宫问题的所有路径及最短路径程序
  5. (二) shiro入门 :输出 hello world
  6. POJ 2240 Arbitrage(判正环)
  7. 设备树下的platform 驱动编写
  8. C#中的串口通信SerialPort
  9. WCF trace、log
  10. 阿里云如何二次驱动云计算
  11. VUE自学日志05-计算属性和侦听器
  12. unity中动态生成网格
  13. 显卡测试软件 温度,显卡温度检测软件
  14. 树莓派是什么?能干什么?和单片机有什么区别?
  15. php验证码 失效,php验证码无法显示的解决方法
  16. Java数据结构项目
  17. 因为Windows防火墙服务未运行,不能正常使用
  18. 异步多线程之入门必知
  19. 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)
  20. Tableau——预警标识

热门文章

  1. 54. yii 动作参数绑定
  2. 6. access_token
  3. [BZOJ5285][HNOI2018]寻宝游戏
  4. MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容
  5. Think In Java 读后感
  6. ZOJ 2412 Farm Irrigation
  7. 显示桌面 图标 创建可以新建一个txt文件,把以下内容放入,名字改为显示桌面 .scf...
  8. WSS3.0开发-过滤列表内容(2)--一个增强的列表元数据查询webpart(SmartQueryWebPart)...
  9. 关于find指令的一点使用小心得 II
  10. 分类数据转换为树形结构