常见排序算法总结(2)希尔排序

一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解)

文章附有动图!一看就懂!

(1)工作原理
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序
是非稳定排序算法。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
①插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
②但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接
插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
(2)算法步骤
①选择一个增量序列 t1,t2,…,tk,其中 ti>tj,tk=1;
②按增量序列个数 k,对序列进行 k 趟排序;
③每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对
各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为
整个序列的长度。
希尔排序的示例:
(3)性能分析
①希尔排序的时间复杂度与增量(即,步长 gap)的选取有关。例如,当增量为 1 时,希
尔排序退化成了直接插入排序,此时的时间复杂度为 O(N²),而 Hibbard 增量的希尔排序的
时间复杂度为 O(N^3/2)。
②稳定性:不稳定

来看一下更直观的图

最后,我们来看一下希尔排序的动画演示,相信你会感叹道,噢原来就是这样。

代码实现:

#include <stdio.h>
#include <malloc.h>void shellSort(int *a, int len); // 函数声明int main(void)
{int i, len, * a;printf("请输入要排的数的个数:");scanf("%d",&len);a = (int *)malloc(len * sizeof(int)); // 动态定义数组printf("请输入要排的数:\n");for (i = 0; i < len; i++) { // 数组值的输入scanf("%d",&a[i]);}   shellSort(a, len); // 调用希尔排序函数printf("希尔升序排列后结果为:\n");for (i = 0; i < len; i++) { // 排序后的结果的输出printf("%d\t",a[i]);}printf("\n");return 0;
}void shellSort(int *a, int len)
{int i, j, k, tmp, gap;  // gap 为步长for (gap = len / 2; gap > 0; gap /= 2) {  // 步长初始化为数组长度的一半,每次遍历后步长减半,for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标 for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序tmp = a[j];  // 备份a[j]的值k = j - gap;  // j初始化为i的前一个元素(与i相差gap长度)while (k >= 0 && a[k] > tmp) {a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位k -= gap;}a[k + gap] = tmp; }}}
}

C/C++排序算法(2)希尔排序相关推荐

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

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

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

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

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

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

  4. 排序算法之希尔排序(Java实现)

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 如何轻松搞定机构资格准入?
  2. 算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布
  3. 15分钟了解Apache Phoenix(HBase的开源SQL引擎)
  4. 二叉树遍历(代码,分析,汇编)
  5. OpenCV中绘制外围矩形框和圆框
  6. 万测试验机软件,万测TestStar®新秀®100kN微机控制电子万能试验机
  7. python perl 日本的应用_将Python,Perl,Ruby或Shell脚本转换为适用于Mac OS X的自包含应用程序 | MOS86...
  8. PHP之数组函数(2)
  9. 三菱M80加工中心伺服电机调试软件带序列号
  10. 怎么看接收灵敏度desense问题?
  11. c语言获取ip地址,如何用C语言获得本机IP地址
  12. 测试工程师,必备图片测试工具 image-test-tools
  13. 欧姆龙 Omorm FINS通讯实例C#
  14. 全民投资人游戏服务器维护,欢乐园《全民仙战》2月3日14时合服公告
  15. iphone7一晚上掉电50%_苹果7待机一晚掉电多少
  16. 汤姆猫炫跑鸿蒙,汤姆猫炫跑游戏怎么操作-玩法规则一览
  17. 「CTS2019 | CTSC2019」氪金手游 解题报告
  18. 申请支付宝-Alipay 密钥流程
  19. C++:【练习题】Project-1 The robots in a warehouse
  20. android画图之贝塞尔曲线讲解

热门文章

  1. rmlv出错处理一例
  2. WMI远程访问问题解决方法
  3. devops失败的原因_如果没有这7个部门的支持,您的DevOps尝试将失败。
  4. (21)npm scripts 实现自动化构建的最简方式
  5. Bootstrap 图片替换
  6. CSS 水平对齐 text-align-last属性
  7. 计算机病毒小学教师资格证面试,小学信息技术人教版四年级上册第15课《病毒防治及时做》优质课公开课教案教师资格证面试试讲教案...
  8. goland创建一个不限长度的字节切片_Go语言3 : 切片
  9. Git笔记(25) 选择修订版本
  10. mysql5.6 replication_MySQL 5.6 Replication