希尔排序介绍

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

希尔排序基本思想

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

希尔排序图解


希尔排序代码

 public static void main(String[] args) {int[] arr = new int[]{8,9,1,7,2,3,5,4,6,0};//        ShellSort_swap(arr);ShellSort_move(arr);}//交换式public static void ShellSort_swap(int[] arr) {int temp = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {//步长为5(每组有两个元素)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("Shell排序后:" + Arrays.toString(arr));}//移位式的希尔排序public static void ShellSort_move(int[] arr){//增量的gapfor (int gap = arr.length / 2; gap > 0; gap /= 2) {int temp = 0;int j = 0;//从第gap个元素开始,逐个对其所在的组进行直接插入for(int i = gap ; i < arr.length ; i++){j = i;temp = arr[j];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;}}}System.out.printf("Shell排序后:%s\n",Arrays.toString(arr));}

这里使用的移位和交换两种实现方式;

  • 两种实现方式的不同在与,交换式每比较一次就要进行交换;
  • 而移位式则在比完这一轮后,找到待排序数据的最终位置后,才把该数据放入指定位置,减少了很多中间不必要的交换;
  • 所以,移位式的实现方式效率要高很多。

排序算法之希尔排序(Java实现)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 常见排序算法之希尔排序

    文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...

  9. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

最新文章

  1. error: mod_deflate has been requested but can not be built due to prerequisite failures
  2. JavaScript常用API总结
  3. (原创)INTERVAL分区表与RANGE分区表相互转化
  4. 为什么要实施服务器虚拟化
  5. ASP.NET进阶(8):HttpModule和HttpApplication
  6. cmd python封装成exe_别再问我怎么Python打包成exe了!
  7. 01数据库、DBMS和SQL
  8. 初一辍学学php能行吗_那些初中就辍学的小姑娘现在过得如何了?
  9. 三条中线分的六个三角形_三角形中的边长和线段(下)
  10. LM NTLM ophcrack RainBow table (转)
  11. Azkaban流2.0
  12. ORB-SLAM2双目开源框架 (2) Tracking解析
  13. 第三方库之 - SDWebImage
  14. b和kb的换算_KB换算
  15. Android Studio如何更改app名称
  16. 真实力好口碑!Fortinet又双叒叕获评Gartner“客户之选”荣誉称号
  17. android+小米文件管理器源码,[MediaStore]小米文件管理器android版源码分析——数据来源...
  18. Power BI Dax 之时间智能函数
  19. PARSEC benchmark下载
  20. java圆的面积_JAVA求圆的面积

热门文章

  1. java的rtsp通信、rtp接收数据、本地实现连续播放视频片段(源源不断)(基本实现)
  2. [DUBBO] Expected single matching of monitor, but found 2 instances, will randomly pick the first one
  3. 安卓webrtc在ubuntu 2004下编译使用
  4. 组态王6.55 modbusRTU数据转发:应用程序命令语言 组态王数据上云
  5. 机器学习习题(11)
  6. Java api 操作 kubernetes
  7. 基于SpringBoot的共享单车管理系统
  8. Vue报错:conflicts with v-model on the same element because the latter already expands to a value
  9. js 时间格式字符串去掉中间的中横线
  10. 019橡皮檫工具,背景橡皮檫工具和魔术橡皮擦工具