直接插入排序算法的时间复杂度为O(n^{2}),如果待排序的序列为"正序"时,时间复杂度为O(n),但是如果比较大的数字在第一个位置,那么进行排序的话需要一直移动到最后一位,比较适合基本有序的排序和数据量不大的排序。希尔排序基于这两点分析对直接插入排序进行改进


目录

一、排序过程

二、代码

三、性能及稳定性分析

1.空间复杂度

2.时间复杂度

3.稳定性


一、排序过程

先将待排序的序列表分割成若干形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,即把相隔某个“增量”的记录组成一个子表,对每个子表进行直接插入排序,当执行到表中的元素基本有序的时候,在对全体元素进行一次直接插入排序。

固定增量的计算为d=n/2,d_{i+1}=\left \lfloor d_{i}/2 \right \rfloor,并且最后一个增量为1。

推荐一个关于数据结构的网站里面有很多知识,排序、堆栈、索引等。数据结构

示意图:(后面几轮和前面几轮思想一样,所以速度加快了)

希尔排序

二、代码

package sort;/*** @author The丶Alanx*/
public class ShellSort {public static void main(String[] args) {int[] arr = {3, 6, 4, 1, 9, 6, 5, 8, 7, 2};System.out.println("排序前为:");for (int i : arr) {System.out.print(i + " ");}System.out.println();shellsort(arr, arr.length);System.out.println("排序后为:");for (int i : arr) {System.out.print(i + " ");}}public static void shellsort(int[] arr, int n) {int temp = 0;for (int dk = n / 2; dk >= 1; dk = dk / 2) {    //步长变化for (int i = dk; i < n; i++) {if (arr[i] < arr[i - dk]) {             //将arr[i]插入有序增量子表temp = arr[i];                          //中间变量存放在tempfor (int j = i - dk; j >= 0 && temp < arr[j]; j -= dk) {arr[j + dk] = arr[j];               //记录后移,查找插入的位置arr[j] = temp;             //插入}}}}}
}

第一趟排序过程: 

结果:

三、性能及稳定性分析

1.空间复杂度

因为排序的整个过程中,仅在当前的数组中操作,没有使用另一个空数组,仅使用了常熟个辅助单元,因此时间复杂度为O(1)

2.时间复杂度

因为希尔排序的时间复杂度和增量序列函数有关系,所以当n在某个特定范围内,希尔排序的时间复杂度约为O(n^{1.3}),在最坏情况下希尔排序的时间复杂度为O(n^{2})

3.稳定性

由上上图对希尔排序第一趟的分析,黑色的6开始在前面蓝色的6在后面,而排完序后黑色的6在蓝色6的后面,当相同关键字的记录被划分到不同的子表时,可能会改变他们的顺序。因此希尔排序是一个不稳定的排序。


数据结构之八大排序——希尔排序相关推荐

  1. 数据结构与算法之希尔排序

    数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...

  2. 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

    独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...

  3. 【数据结构-排序】1. 图解插入排序三种实现(插入排序/折半排序/希尔排序)

    直接插入排序(插入排序) 排序思想 对于一个数组 A[0,n] 的排序问题,假设认为数组在 A[0,n-1] 排序的问题已经解决了. 考虑 A[n] 的值,从右向左扫描有序数组 A[0,n-1] ,直 ...

  4. 数据结构之内部排序--希尔排序

    概要 -IDE:Pycharm -Python版本:python3.x -算法分类:内部排序->插入类排序->希尔排序 算法思想 希尔排序又称缩小增量排序法,是一种基于插入思想的排序方法. ...

  5. 【每天学一点 - 算法篇 - 排序 - 希尔排序】

    系列文章目录 [每天学一点 - 算法篇 - 排序 - 插入排序] 文章目录 系列文章目录 前言 一.什么是希尔排序 二.原理 1.思路 2.示例 3.抽象 三.代码 四.复杂度 总结 前言 小时候听蛋 ...

  6. 算法---排序--希尔排序和快速排序

    冒泡.选择.插入排序算法是三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递 ...

  7. 排序---希尔排序实现和性能分析

    希尔排序 希尔排序是简单插入排序的改进,直接插入排序的最坏情况时间复杂度达到O(n^2),比如从大到小的一串数字654321,使用插入排序从小到大进行排序,这就达到插入排序的最坏情况. 希尔排序是把记 ...

  8. 数据结构例程——插入排序之希尔排序

    本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef i ...

  9. Java数据结构与算法(六) 希尔排序

    ###一.希尔排序的产生 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提 ...

最新文章

  1. dubbo web工程示例_dubbo实战之二:与SpringBoot集成
  2. 设计模式-结构性模式
  3. android preference tab,Android SharedPreference - TabHost问题
  4. python opencv 打开图像时报错 (-215:Assertion failed) size.width0 size.height0 in function 'cv::imshow'
  5. html5中标签分为,HTML标签的三种类型
  6. C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
  7. MySQL Root密码丢失解决方法总结
  8. opencv函数速查笔记
  9. 怎么把一个PDF文件拆分成多个?
  10. 论文相关-MATHTYPE字体对应
  11. 内存类型UDIMM、RDIMM、LRDIMM大解析
  12. SPR1: Spring简介
  13. 用C语言实现打开一个网页
  14. 与sourceinsight媲美的代码阅读工具
  15. 流体机械原理及设计主要知识点
  16. python唯美壁纸_Python爬取5K分辨率超清唯美壁纸
  17. 服务器系统清理工具,服务器清理内存工具
  18. dmhs部署和dmhs web配置dm到dm同步
  19. Edge打不开中国知网的一次经历
  20. 爱淘php,PHP文件操作实现代码

热门文章

  1. PointNet代码详解
  2. 【python】库丨collections丨
  3. 有些人控制欲望真tmd强,想杀人!
  4. Evernote(印象笔记) 如何迁移到语雀?
  5. 海外广告投放和国内广告投放区别
  6. 详解Python模块化——模块(Modules)和包(Packages)
  7. 2021-10-262021年茶艺师(高级)考试题及茶艺师(高级)考试内容
  8. 传感器-光感和指南针
  9. 关于《北京市安全生产专项整治三年行动计划》的解读
  10. java 登录牵手_java初探(1)之登录总结