常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

关于时间复杂度

1.     平方阶 (O(n2)) 排序各类简单排序:直接插入、直接选择和冒泡排序。

2.     线性对数阶 (O(nlog2n)) 排序快速排序、堆排序和归并排序;

3.     O(n1+§))排序,§ 是介于 0 和 1 之间的常数。希尔排序

4.     线性阶 (O(n)) 排序基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。


名词解释

n:数据规模

k:“桶”的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同

希尔排序

希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

1. 算法步骤

1.       选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

2.       按增量序列个数 k,对序列进行 k 趟排序;

3.       每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

2. JavaScript 代码实现

functionshellSort(arr) {var len =arr.length,temp,gap =1;while(gap < len/3) {          //动态定义间隔序列gap =gap*3+1;}for (gap; gap >0; gap =Math.floor(gap/3)) {for (var i = gap; i < len; i++) {temp = arr[i];for (var j = i-gap; j >=0&& arr[j] > temp; j-=gap) {arr[j+gap] = arr[j];}arr[j+gap] = temp;}}return arr;
}

3. Python 代码实现

def shellSort(arr):import mathgap=1while(gap < len(arr)/3):gap = gap*3+1while gap > 0:for i in range(gap,len(arr)):temp = arr[i]j = i-gapwhile j >=0 and arr[j] > temp:arr[j+gap]=arr[j]j-=gaparr[j+gap] = tempgap = math.floor(gap/3)return arr
}

4. Go 代码实现

func shellSort(arr []int) []int {length := len(arr)gap := 1for gap < gap/3 {gap = gap*3 + 1}for gap > 0 {for i := gap; i < length; i++ {temp := arr[i]j := i - gapfor j >= 0 && arr[j] > temp {arr[j+gap] = arr[j]j -= gap}arr[j+gap] = temp}gap = gap / 3}return arr
}

5.Java代码实现

public void shellSort(int[] list) {int gap = list.length / 2;while (1 <= gap) {// 把距离为 gap 的元素编为一个组,扫描所有组for (int i = gap; i < list.length; i++) {int j = 0;int temp = list[i];// 对距离为 gap 的元素组进行排序for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) {list[j + gap] = list[j];}list[j + gap] = temp;}System.out.format("gap = %d:\t", gap);printAll(list);gap = gap / 2; // 减小增量}
}

探讨交流技术、或者对编程感兴趣,都可以加我qq: 525331804

转载于:https://blog.51cto.com/liuzhiying/1927287

算法系列【希尔排序】篇相关推荐

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

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

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

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

  3. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

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

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

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

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

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

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

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

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

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

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

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

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

  10. 【算法】希尔排序 推导方法

    文章目录 1.概述 2. 模拟 3. 推导 4. 性能 5. 位移方法 1.概述 希尔排序是希尔(DonaldShell) 于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经 ...

最新文章

  1. 远程连接身份验证错误,又找不到加密Oracle修正
  2. 2017-12-04HTML布局_div布局
  3. oracle sql 分区查询语句_oracle11g 表分区后的查询语句如何知道是否进行了全表扫描...
  4. idea struts插件_使用Struts 2的查询网格(无插件)
  5. Python调用C的方法
  6. 十大经典排序算法2(Python版本)
  7. bzoj 1303: [CQOI2009]中位数图
  8. 高度设置为100%无效的解决办法
  9. android平板改成电视盒子,安卓平板改裝成電視盒子
  10. Discuz仿今日头条模板/Discuz新闻资讯商业版GBK模板
  11. 道可道,非常道;名可名,非常名
  12. 哪款蓝牙耳机游戏体验感好?适合打游戏的蓝牙耳机推荐
  13. 禅道CMS 11.6漏洞
  14. C语言之strrchr函数
  15. 乐学python靠得住吗_乐学python答案
  16. Integer源码详解
  17. CRM ORDER_MAINTAIN
  18. Windows服务与网络端口
  19. Mysql基础命令记录
  20. Python - python如何连接sql server数据库

热门文章

  1. Android短信的发送和广播接收者实现短信的监听
  2. modelsim的destbench模型1
  3. 简洁易懂,初学者挑战学习Python编程30天 (一)
  4. 同时起两个mysql 起不了_到底是谁!让你在冬天的早晨起不了床?
  5. JSP笔记-页面重定向
  6. 聊聊linux查看服务和端口状态命令netstat
  7. 怎样学会单片机?先学什么,怎么入门?
  8. python提取两个引号中的内容,怎样用 Python 提取不在双引号的内容?
  9. 关于加载Fashion MNIST数据集时可能会出现的问题
  10. 习题5-5 使用函数统计指定数字的个数 (15 分)