希尔排序是1959 年由D.L.Shell提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序

基本思想

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

算法

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8…..1} n为要排序数的个数

即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

Code

JAVA:

package sort;import java.util.Arrays;public class ShellSort {public static void main(String[] args) {int a[] = {49,38,65,97,76,13,27,49,55,4};shellSort(a);System.out.println(Arrays.toString(a));}public static void shellSort(int[] arr) {int j = 0;int tmp = 0;int n = arr.length;for (int d = n/2; d >0; d /= 2) {System.out.println("increment:" + d);for (int i = d; i<n ; i ++) {tmp = arr[i];j = i-d;while (j>=0 && tmp < arr[j]) {arr[j+d] = arr[j];//元素右移j -= d;}arr[j+d] = tmp;}System.out.println(Arrays.toString(arr));}}
}

result:

increment:5
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
increment:2
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
increment:1
[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]
[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]

Python

a = [49,38,65,97,76,13,27,49,55,4]def Shell_sort(arr):tmp = 0n = len(arr)d = int(n/2)while d>0:d = int(d/2)print("Increment: %d" %d)for i in range(d,n):tmp = arr[i]j = i-dwhile j>=0 and tmp < arr[j]:arr[j+d] = arr[j]j -= darr[j+d] = tmpprint(arr)return arrprint(Shell_sort(a))

时效

希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,使得排序的效率提高。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外,由于记录是跳跃式的移动,希尔排序是一种不稳定的的排序算法。
希尔排序最好时间复杂度和平均时间复杂度都是O(nlogn),最坏时间复杂度为O(n^2)

参考

http://blog.csdn.net/jianyuerensheng/article/details/51258460

http://blog.csdn.net/hguisu/article/details/7776068/

排序算法——希尔排序相关推荐

  1. 经典排序算法 - 希尔排序Shell sort

    经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第 ...

  2. python排序算法——希尔排序(附代码)

    python排序算法--希尔排序 文章目录 python排序算法--希尔排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法 ...

  3. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 排序算法——希尔排序的图解、代码实现以及时间复杂度分析

    希尔排序(Shellsort) 希尔排序是冲破二次时间屏障的第一批算法之一. 希尔排序通过比较相距一定间隔的元素来工作:各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.由 ...

  5. 排序算法——希尔排序(缩小增量排序)

    1.希尔排序思想: 希尔排序就是把数据分成若干份子序列,从第一个元素开始,和每间隔为n的元素分成一个子序列,对每一份子序列实行直接插入排序,然后合并成一个新序列,继续对新序列以间隔m分成若干份,继续重 ...

  6. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

  7. 希尔排序是一种稳定的排序算法_排序算法—希尔排序

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

  8. ds排序--希尔排序_排序算法 - 希尔排序分析及优化

    希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...

  9. 排序算法----希尔排序

    1. 希尔排序:1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之处在于,它会优先比较距离较远的元素.希尔排序又叫缩小增量排序. 2. 希尔排序的 ...

最新文章

  1. 关于lucene的书
  2. SpringMVC运行报错 unable to find resource 'XXX.vm' in any resource loader
  3. 《gcc五分钟系列》第六节:编译期符号检查
  4. Intel初始化和模式切换示例
  5. Trees on the level UVA - 122 (二叉树的层次遍历)
  6. 4.XXE (XML External Entity Injection)
  7. mysql 2000安装教程_Win10 64位安装个人版SQL2000图文教程
  8. 度数秒分在线计算机,秒的换算(在线时间换算器)
  9. 应用工具推荐phpStudy(小皮面板)
  10. 基于Python的无参考图像质量评价
  11. OpenCV-Python的文本透视矫正与水平矫正
  12. 百度地图瓦片层级范围对照表
  13. Attribute 特性详解
  14. 数据链路层的PPP协议
  15. 统计学习方法的概括和补充
  16. python中字符串转xml对象_将文本字符串转换为XML
  17. web前端技术的学习(一)
  18. 换发型算法_如何用手机美图秀秀换发型
  19. 苏教版三年级数学应用计算机答案,苏教版三年级数学下册复习题
  20. 骨传导耳机为什么不普及?分析骨传导耳机的利与弊

热门文章

  1. google gflags命令行参数处理(c++)
  2. markdown语法之表格
  3. C语言-if...else if...else 语句
  4. React 入门教程笔记
  5. 给静态图片添加动态效果
  6. 图像梯度算法中算子的由来
  7. Linux学习:Linux启动管理器GRUB2
  8. WPS JS宏示例——工作表排序
  9. not in和or 出的问题
  10. 数据标注基础知识:文本数据标注的类型及应用场景