一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

二、适用说明

希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。

三、过程图示

希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

在此我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2...1} 来表示。

如图示例:

(1)初始增量第一趟 gap = length/2 = 4

(2)第二趟,增量缩小为 2

(3)第三趟,增量缩小为 1,得到最终排序结果

代码示例:

#include<iostream>using namespace std;void shellSort(int data[], int n)
{int gap = n / 2;while(gap > 0){for(int i = gap; i < n; i++){int tmp = data[i];int j = i - gap;while (j >= 0 && tmp < data[j]){data[j + gap] = data[j];j = j - gap;}data[j + gap] = tmp;}gap = gap / 2;//减小增量}
}int main()
{int d[] = { 12, 15, 9, 20, 6, 31, 24 };cout << "输入数组  { 12, 15, 9, 20, 6, 31, 24 } " << endl;shellSort(d, 7);cout << "排序后结果:" ;for (int i = 0; i < 7; i++){cout << d[i] << " ";}return 0;
}

数据结构与与算法之希尔排序相关推荐

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

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

  2. 数据结构:从插入排序到希尔排序

    数据结构:从插入排序到希尔排序 插入排序 算法思路 每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程. n个待排序的元素由一个有序表和一个无序表组成,开 ...

  3. python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析

    本文实例讲述了Python排序搜索基本算法之希尔排序.分享给大家供大家参考,具体如下: 希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换来提高执行效率.希尔排序最关键的是选择步长,本程序选用Kn ...

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

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

  5. Java排序算法之——希尔排序

    算法简述 希尔排序也叫作shell排序或缩小增量排序,据说是一个叫D.L.Shell的人发明出来的,顾取名shell排序.这种排序是基于插入排序思想的,也比较适用于数据量大时. 我刚开始看到时候对于插 ...

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

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

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

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

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

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

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

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

最新文章

  1. yum源简单介绍及本地yum源的搭建
  2. 加密和解密算法 Asp.net
  3. OO第一单元总结博客
  4. JSP 第一天:提交表单--获取表单中的数据值
  5. file的open()和read()
  6. spark的外排:AppendOnlyMap与ExternalAppendOnlyMap
  7. Java常用接口与类——String类、StringBuffer类、StringBuilder类
  8. AcWing 890. 能被整除的数(容斥原理)
  9. javascript中的cookie
  10. mysql 附近3公里的,mysql 查询附近N公里内数据
  11. 解决SQLPLUS无法使用上下箭头
  12. 使用C++实现FC红白机模拟器 概述
  13. 三菱服务器位置控制,关于三菱PLC 相对位置绝对位置控制问题
  14. Java的求学之路--Day01
  15. Tiptop CR报表axcr700采购入库月报增加tlf99“多角贸易序号”,部分资料无数据修复4gl文件bug
  16. linux解压7z文件,linux 中解压7z文件
  17. Facebook第三方登录对接
  18. 处理办公文档通过共享打印机无法打印
  19. Beef在kali系统中安装出现问题如何解决
  20. 科普:什么是ChatGPT?

热门文章

  1. 优化更新语句中的标量子查询
  2. 意外断电后,Zabbix_proxy 重启无任何相关进程,如何处理?
  3. CentOS下安装JDK完整步骤
  4. rm删除报错 :-bash: syntax error near unexpected token `('
  5. 触发器中的 临时表 old 与 new
  6. Safari浏览器(有时没有图片时,提交会出现问题)。
  7. 【Linux】七种运行级别
  8. 利用nginx 反向代理解决跨域问题
  9. 乐观锁 与 悲观锁 来解决数据库并发问题
  10. 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小