常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心

OJ链接


希尔排序

在 插入排序 已经提到当数组接近有序的时候,时间复杂度趋于O(N)。

所以希尔排序是基于直接插入排序的优化,通过预排序使数组趋于有序,这种情况对逆序数组更加明显。

希尔排序的分为预排序(gap > 1)和直接插入( gap == 1)排序两步骤。

预排序,使数组接近有序

按照gap分组,对每一组进行插入排序。

假设 gap = 3

对gap组预排序完毕

对逆序数组按照gap进行分组,更接近有序。

时间复杂度

最好:O(N)
最坏:F(N, gap) = (1+2+3+ …… + N/gap)* gap

所以,gap越大,预排越快,但是预排之后越不接近有序

对一组gap进行单趟排序

     for (int i = 0; i < n - gap; i += gap){// 对其中一组进行单趟的插入排序int end = 0;int x = a[end + gap];while (end >= 0){// end=-1时,退出if (a[end] > x){a[end + gap] = a[end];end -= gap;}else{// a[end] <= xbreak;}}a[end + gap] = x;}

对这一gap组排序完毕

 int gap = 3;for (int j = 0; j < gap; ++j){for (int i = 0; i < n - gap; i += gap){// 对其中一组进行单趟的插入排序int end = 0;int x = a[end + gap];while (end >= 0){// end=-1时,退出if (a[end] > x){a[end + gap] = a[end];end -= gap;}else{// a[end] <= xbreak;}}a[end + gap] = x;}}

优化

gap 从n 开始预排序,同时多组gap一起排序。

void ShellSort(int* a, int n)
{int gap = n;while(gap > 1){gap /= 2;for(int i = 0; i < n-gap; ++i){// 对一个gap组的一个单趟排序int end = i;int x = a[end+gap];while(end >= 0){if(a[end] > x){a[end+gap] = a[end];end -= gap;}else{break;}}a[end+gap] = x;}}
}

时间复杂度

gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计。

所以时间复杂度按照 O(N^ 1.25) 到 O(1.6*N ^ 1.25)计算。

【数据结构】希尔排序相关推荐

  1. 数据结构:希尔排序(shell sort)

    希尔排序-----交换法 import java.util.Arrays;public class ShellSort {public static void main(String[] args) ...

  2. [数据结构] 希尔排序

    概述 希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法. 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键 ...

  3. python算法与数据结构-希尔排序算法

    希尔排序(shell sort)是插入排序的一种,也称缩小增量排序,与普通的插入算法的区别就是gap步长. 希尔排序内层循环逻辑如下所示: 上面的可以分为4组,一个一个的按照插入算法来做,第一组有54 ...

  4. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  5. java 数据结构--希尔排序

    2019独角兽企业重金招聘Python工程师标准>>>     希尔排序(Shell Sort)又称缩小增量排序算法的基本思路是:先取一个小于n的整数(称为增量)然后把排序中的n个记 ...

  6. 数据结构-希尔排序(Java实现)

    希尔排序 对插入排序的优化 因为当如果插入排序中最小的元素位于最后一位时,就需要不断的进行循环判断,直到第一位,非常影响效率 package datastructure.sort;/*@CreateT ...

  7. 基本算法学习(一)之希尔排序(JS)

    参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...

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

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

  9. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

    码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...

  10. 希尔排序python 简书_数据结构_排序_直接插入+希尔排序

    数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...

最新文章

  1. 【数据分析】33个热门数据分析软件,你都用过哪些?
  2. linux-2.6.29内核配置、编译与安装
  3. P5496-[模板]回文自动机【PAM】
  4. c语言 字符串不足用零代替,关于c语言的知识点不足的地方
  5. 我的站(艾网---城市生活新门户)重新上线了
  6. linux下Apache默认安装路径
  7. 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式
  8. 关于NX UG11.0在visual studio中不能创建模板的问题
  9. NOD32升级账号更新器 [ C# | NOD32 | Eset ]
  10. 中国历史上最伟大帝王排行榜
  11. Mac电脑鼠标滚轮方向相反的解决办法
  12. lineage+os+15+android,小米5 原生 Android 8.1“奥利奥”——lineageOS 15.1安装教程
  13. android系统wifi控制风扇,无线远程遥控风扇设计实现
  14. 76、多边形一些基本操作(自相交、尖刺、保证逆时针、求交)
  15. 布尔盲注运用burp的操作
  16. C++ 高效编程:pass-by-value(值传递)与pass-by-reference(引用传递)
  17. php yii的优缺点,YII2框架的优缺点是什么
  18. 面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》
  19. 安搭Share——人不要怕“变”,要守住自己的“常”
  20. 电源管理-配置唤醒源

热门文章

  1. 【PPT】集团信息化总体规划
  2. 计算机毕业设计Java博物馆交流平台(源码+系统+mysql数据库+lw文档)
  3. 唯美高清+自动对白404页面首页源码
  4. 你知道文字转语音软件有哪些吗
  5. 用python抓取斗鱼网的弹幕
  6. 青城山 天下幽、都江堰 天下敬
  7. 非标准正态分布的累计分布函数
  8. Evernote(印象笔记) 如何迁移到语雀?
  9. 故宫停止开放?小县城老民警蹲守故宫6年拍下3万张绝美照片,连单霁翔院长都忍不住点赞!...
  10. Linux的不同操作系统