6.6 希尔排序

6.6.1 插入排序的问题所在

对于插入排序存在一个问题: 如果待排序列前面的数据已经有序,而恰巧靠后的数字又比较小,后面的数据就要一直比较到最前面,这样需要比较的次数比较多;
希尔排序解决这一问题: 把整个待排序列进行增量分组,对每组使用插入排序算法,没排序完,使得增量减半,随着增量的逐渐减小至1,整个数组被分成一组进行排序,而此时大部分数据已经处于有序位置,
即使无序数据也离正确的位置不远,比较次数少。

6.6.2 希尔排序的思想

插入排序时比较相邻的元素大小,进行插入,希尔排序是在插入排序的基础上,对所有待排序以一个间隔进行插入排序,间隔gap的初始化值可以设置为数组长度的一半,每当一轮以gap为单位的插入排序结束之后,减小gap的值,直至gap等于1,此时最后一轮排序时,整个数组的大部分元素已经处于有序位置,进行最后一轮插入排序。可以理解为希尔排序是在插入排序的基础上进行的。

6.6.3 希尔排序示意图


6.6.4 代码分析:

package com.kevin.sortAlgorithm;
import java.util.Arrays;/*** @author : kevin ding* @date : 2022/3/3 21:47* @description :   对于插入排序存在一个问题: 如果待排序列前面的数据已经有序,而恰巧靠后的数字又比较小,后面的数据就要一直比较到最前面,这样需要比较的次数比较多;希尔排序解决这一问题: 把整个待排序列进行增量分组,对每组使用插入排序算法,没排序完,使得增量减半,随着增量的逐渐减小至1,整个数组被分成一组进行排序,而此时大部分数据已经处于有序位置,即使无序数据也离正确的位置不远,比较次数少*/
public class ShellSortDemo {public static void main(String[] args) {// int[] array = {8,9,1,7,2,3,5,4,6,0};// System.out.println("排序之前,结果为:");// System.out.println(Arrays.toString(array));// // shellSortAnalysis(array);// shellSort(array);// 对于  100000个数据进行排序,求其时间int[] array = new int[80000];for (int i = 0; i < array.length; i++) {array[i] = (int) (Math.random() * 8000000);}Long startTime = System.currentTimeMillis();shellSort(array);Long endTime = System.currentTimeMillis();System.out.println("希尔排序 所耗费的时间是:" + (endTime-startTime) + "ms");       // 12ms}public static void shellSortAnalysis(int[] array){// 对于一组数据,首先指定增量初始值为数组长度的一半 gap = 10/2 =5;// 下标分组情况为 0,5; 1 6; 2 7; 3 8;  4 9 对这5组数据分别进行插入排序// int temp;   // 临时变量用于数据交换int insertValue;int insertIndex;// 第一轮排序:将10个数据分成了5组 需要遍历从gap之后的数 步长为gapint gap = 5;// 从 array[gap]到array[n-1]的元素为带插入元素,前面的有序元素为分组for(int i=gap; i<array.length; i++){//insertIndex = i;insertValue = array[i];// 此时需要进行比较的元素是与insertIndex相差gap的一个元素  比前一个gap的元素小,则需要进行交换// 若insertIndex小于gap了,则说明其前面没有相距gap的值了,已经处于了这组中合适的位置while(insertIndex >=gap && array[insertIndex - gap] > insertValue){// 需要进行交换array[insertIndex] = array[insertIndex- gap];array[insertIndex-gap] = insertValue;insertIndex -= gap;}}System.out.println("第1 轮shell排序之后:");System.out.println(Arrays.toString(array));// 第2轮排序:将10个数据分成了5/2 = 2组 需要遍历从gap之后的数 步长为gapgap = 2;// 从 array[gap]到array[n-1]的元素为带插入元素,前面的有序元素为分组for(int i=gap; i<array.length; i++){//insertIndex = i;insertValue = array[i];// 此时需要进行比较的元素是与insertIndex相差gap的一个元素  比前一个gap的元素小,则需要进行交换// 若insertIndex小于gap了,则说明其前面没有相距gap的值了,已经处于了这组中合适的位置while(insertIndex >=gap && array[insertIndex - gap] > insertValue){// 需要进行交换array[insertIndex] = array[insertIndex- gap];array[insertIndex-gap] = insertValue;insertIndex -= gap;}}System.out.println("第1 轮shell排序之后:");System.out.println(Arrays.toString(array));// 第3轮排序:将10个数据分成了2/2 = 1组 需要遍历从gap之后的数 步长为gapgap = 1;// 从 array[gap]到array[n-1]的元素为带插入元素,前面的有序元素为分组for(int i=gap; i<array.length; i++){//insertIndex = i;insertValue = array[i];// 此时需要进行比较的元素是与insertIndex相差gap的一个元素  比前一个gap的元素小,则需要进行交换// 若insertIndex小于gap了,则说明其前面没有相距gap的值了,已经处于了这组中合适的位置while(insertIndex >=gap && array[insertIndex - gap] > insertValue){// 需要进行交换array[insertIndex] = array[insertIndex- gap];array[insertIndex-gap] = insertValue;insertIndex -= gap;}}System.out.println("第1 轮shell排序之后:");System.out.println(Arrays.toString(array));}}

6.6.5 代码实现:

public static void shellSort(int[] array){// 上述的逐次过程中,只有gap在发生变化,可以进行循环// 定义待比较元素值 和 该元素合适的位置索引int insertValue;int insertIndex;int count = 0;// 第一轮排序:将10个数据分成了5组 需要遍历从gap之后的数 步长为gapint gap = array.length / 2;while(gap > 0){// 从 array[gap]到array[n-1]的元素为带插入元素,前面的有序元素为分组for(int i=gap; i<array.length; i++){//insertIndex = i;insertValue = array[i];// 此时需要进行比较的元素是与insertIndex相差gap的一个元素  比前一个gap的元素小,则需要进行交换// 若insertIndex小于gap了,则说明其前面没有相距gap的值了,已经处于了这组中合适的位置while(insertIndex >=gap && array[insertIndex - gap] > insertValue){// 需要进行交换array[insertIndex] = array[insertIndex- gap];array[insertIndex-gap] = insertValue;insertIndex -= gap;}}// 一轮循环结束,gap的值减半gap /= 2;}}

希尔排序分析及代码实现相关推荐

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

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

  2. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  3. 希尔排序和C代码讲解

    希尔排序实际的C代码讲解 1.希尔排序原理 希尔排序用于将数组内元素进行排序,方法是设置"跨度"将数组进行分组 假设上面是待排数组,那么怎么进行排序呢?首先确定"跨度&q ...

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

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

  5. 希尔排序(缩小增量排序)(插入排序的优化版) C++代码实现及算法分析 恋上数据结构笔记

    文章目录 复习概要 算法思想 算法流程 算法复杂度分析及稳定性 希尔排序代码正常版 希尔排序与插入排序代码对比 希尔排序个人青春版(别看以免走上歧途) 复习概要 算法思想与流程 分这么多组分别插入排序 ...

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

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

  7. 下划线间隔数字 排序_面试必备:经典算法动画解析之希尔排序

    哈喽,我是程序员大鹏. 前面我们介绍了冒泡排序.选择排序和插入排序,今天我们来看一下进阶的排序. 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之 ...

  8. 希尔排序(动图+详解)

    希尔排序 算法 希尔排序是按照其设计者希尔的名字命名的,他对插入排序的效率进行了分析,得出如下结论: 在最坏情况下即待排序序列为逆序时,需要消耗O(n^2)的时间 在最好情况下即待排序序列为顺序时,需 ...

  9. 希尔排序( Shell Sort )使用不同的步长序列( gaps )

    希尔排序( Shell Sort )使用不同的步长序列( gaps ) 希尔排序的定义 希尔排序(Shellsort),也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法 ...

最新文章

  1. python下载安装教程3.8.0-windows中安装Python3.8.0的实现方法
  2. 详细聊聊Javadoc注释规范
  3. 1109 Group Photo (25 分)【难度: 一般 / 知识点: 模拟 排序】
  4. how CRM One Order search by contact name work in the past
  5. 在UnitTest中读取*.config文件的郁闷
  6. 讲字节数组转化为base64_Base64编码简介及简单实现
  7. 熊吃人该不该杀?这头3米高的大熊吃了7个人,还在洞里藏了很多女人用的东西.........
  8. 什么是Hadoop,怎样学习Hadoop
  9. PHP读取表格都是精度,php 小数精度问题
  10. Wannafly挑战赛28A(模拟,题意文字游戏)
  11. 应用java编写 按键小脚本_一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码) | 学步园...
  12. Boom 2 for Mac(音频助推器及均衡器) v1.6.7中文激活版
  13. PD--SqlServer生成Hive建表语句
  14. 华南理工计算机就业棒棒,国内3所校名“一字之差”的大学:均为理工大学,实力却天差地别...
  15. 高校毕业生登记表计算机水平,高校毕业生登记表
  16. 认认真真推荐9个高质量公众号
  17. 交付管理——怎样预判项目风险
  18. ESL4.3 线性判别分析(LDAQDA)学习笔记
  19. 判断一句话是否中文或者英文
  20. 【转】Vczh Library++3.0之可配置语法分析器(前言)

热门文章

  1. 建站+SEO(基础+)在线网课-优就业-专题视频课程
  2. CoOS使用教程——信号量
  3. Cortex M0下coos调度上下文切换原理
  4. 华为无线学习笔记--WLAN基本理论
  5. wappalyzer 上各种开源框架功能
  6. Palisade DecisionTools Suite Unexpected error解决办法
  7. FireEye 666漏洞
  8. 校园水电能源监测管理系统
  9. 小程序如何实现抖音视频效果?
  10. 老人意外保险怎么买?除了意外险还有哪些老人保险值得买?