希尔排序

算法

希尔排序是按照其设计者希尔的名字命名的,他对插入排序的效率进行了分析,得出如下结论:

  1. 在最坏情况下即待排序序列为逆序时,需要消耗O(n^2)的时间
  2. 在最好情况下即待排序序列为顺序时,需要消耗O(n)的时间

于是希尔就想:若是能先将待排序序列进行一次预排序,使待排序序列接近有序,然后再对该序列进行一次插入排序。因此此时直接插入排序的时间复杂度为O(n),那么只需控制预排序阶段的时间复杂度小于O(n^2)那么整体的时间复杂度就比插入排序的时间复杂度低了

那具体的预排序应该怎么做才会时间复杂度满足要求呢?

  1. 先选定一个小于n的整数gap(一般情况下是将n/2作为gap)作为第一增量,然后将所有距离为gap的元素分为一组,并对每一组进行插入排序
  2. 重复步骤1,直到gap等于1停止,这时整个序列被分到了一组,进行一次直接插入排序,排序完成

你可能会疑惑,为什么gap由大到小?

因为gap越大,数据挪动的越快,耗时少;gap越小,数据挪动的越慢,耗时多。前期让gap较大,可以让数据快速移动到自己对应位置附近,减少挪动次数

下面是希尔排序的动画演示:

我们来举一个实例:

  1. 首先gap取5,此时相隔距离为5的元素分到了一组(一共五组,每组两个元素),然后对每一组分别进行插入排序

  2. gap折半为2,此时相隔距离为2的元素被分到了一组(一共两组,每组五个元素),然后对每一组分别进行插入排序

  3. gap再次折半为1,此时所有元素被分到了一组,对它进行插入排序,至此插入排序完成

本例中前两趟就是希尔排序的预排序,最后一趟就是希尔排序的插入排序

代码实现

#include <iostream>
using namespace std;
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap /= 2;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}int main()
{int arr[] = { 23, 232, 44, 55, 11,  56, 2 };int sz = sizeof(arr) / sizeof(arr[0]);ShellSort(arr, sz);return 0;system("pause");
}

希尔排序(动图+详解)相关推荐

  1. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  2. python 制作gif-利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有 ...

  3. (动图详解)汇编视角观察函数栈帧的创建和销毁

    目录 ​1.阅读本文的价值 ​2.函数栈帧及栈的概念 ​3.部分寄存器及汇编指令 ​4.main函数的调用 5.main函数的栈帧创建 ​6.变量的栈帧创建 ​6.函数传参 ​7.函数内部运算及销毁 ...

  4. 制作gif动图python_利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有 ...

  5. 排序算法——冒泡排序原理动图详解及实现

    主要涉及的是内部排序  交换排序   => 冒泡排序   快速排序  选择排序   直接选择排序   堆排序  插入排序   直接插入排序   希尔排序  归并排序 冒泡排序 1. 简介 冒泡排 ...

  6. 插入排序,二分版插入排序和希尔排序的差别详解(C语言)

    希尔排序只是在插入排序最外层加了一层循环并把插入排序中原本为一的步长改变,只需改变插入排序中与1有关的部分为step即可,但当使用哨兵(arr[0])当作中间变量时需要注意最里层的for循环条件详见代 ...

  7. 【数据结构】动图详解二叉树——堆及堆排序

    目录 一.树的概念 1.树的特征 2.树的相关名词 二.树的表示方法 1.左孩子右兄弟表示法 2.双亲表示法 三.特殊二叉树 四.堆的向上调整算法建堆及排序 1.向上调整建堆O(N*logN) 2.向 ...

  8. python画动图-利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有 ...

  9. pythongif字符动图,利用Python如何制作好玩的GIF动图详解

    前言 之前我们分享过用Python进行可视化的9种常见方式.其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表. 假如电脑上没有 ...

最新文章

  1. spring中那些让你爱不释手的代码技巧
  2. python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍
  3. 哥伦比亚大学浙江大学计算机,大神offer | 恭喜C同学录取哥伦比亚大学-数据科学硕士!...
  4. ASP.NET Core 集成 React SPA 应用
  5. 排序链表(归并排序)
  6. FIFO IP核的使用
  7. 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)...
  8. 发布地图服务时导入已有的tpk切片包作为缓存
  9. 第一篇自用博客:git的操作(防忘记用的hh)封面是我最爱的歌手ikura强推她的每一首歌,简直就是行走的唱片啊有木有!
  10. pkl形式的数据集读取和可视化
  11. 在线编码工具_每个新编码员都需要25种工具
  12. 解决Font shape `TU/ptm/m/n‘ undefined (Font)的问题 -- Latex
  13. 胆结石饮食有什么禁忌?4类食物要少吃
  14. Linux 查看磁盘IO的使用
  15. MTK屏蔽谷歌服务报错对话框KK
  16. oracle sql常用的函数,界别Oracle和SQL Server常用函数
  17. SQL图文讲解操作12-多表查询
  18. Ubuntu16.04 RTX2060 安装CUDA10.2
  19. 全麦吐司和普通吐司的区别_全麦土司和白土司有什么区别?
  20. Air800(GPRS+GPS模块)连接OneNet平台

热门文章

  1. 新手焊接电路板_如何焊接电路板
  2. 我们不想清楚Web2.0的得失成败,我们就无法成功开启Web3.0
  3. 统信UOS系统无法卸载软件怎么办
  4. ZMQ 第一章 ZeroMQ基础
  5. 获取电脑桌面上图标的信息
  6. 等候·《致我们终将逝去的青春》
  7. 如何保障测试用例的覆盖率
  8. 职工信息管理系统c语言报告,职工信息管理系统(c语言实现)
  9. Android蓝牙问题
  10. Swiper4.0:H5手机端滑屏判断当前页Index并且触发动画(slideChangeTransitionEnd与swiper.activeIndex)