插入排序算法之希尔排序

一、前沿:

希尔排序(Shell Sort)的名称源于它的发明者Donald Shell,该算法是冲破了二次元时间屏障的算法之一。它通过比较相距一定间隔的元素工作,各趟所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟为止,因此希尔排序有时也叫做缩减增量排序(diminishing increament sort)。

二、详细步骤:

希尔排序使用一个序列h1,h2,......ht 叫做   增量序列,只要h1=1,任何增量序列都是可行的,在使用hk的一趟增量序列后,数组中任何a[i]<=a[i+k]是有意义的。所有相隔k的元素都是有序的,此时称之为数组是hk有序的。下图为希尔排序每趟后的情况:

hk排序的一般做法是,对于hk,hk+1.......N-1中的每一个位置i,把其上的元素放置在i,i-hk,i-2hk,.....中的正确位置上。虽然并不影响最终结果,但通过观察可发现,一趟hk排序的作用就是对hk个独立的子数组执行一次插入排序,在分析希尔排序的运行时间时,这个观测结果是很重要的!!

三、算法实现

在考虑到增量序列的问题中,可以通过ht=[n/2]和hk=[hk+1/2]。也可以通过自己设定增量序列来实现:

 1     /**
 2      * 希尔排序是简单插入排序的改进版,突破了复杂度为O(n*n)的排序算法,它与插入排序不同的是
 3      * ,它会优先比较距离较远的元素,它又叫缩小增量排序
 4      */
 5     public static void shellSort1(int[] r, int low, int high, int[] delta) {
 6         for (int k = 0; k < delta.length; k++)
 7             shellInsert(r, low, high, delta[k]); //一趟步长为 delta[k]的直接插入排序
 8     }
 9     //shellInsert 执行的是插入排序
10     private static void shellInsert(int[] r, int low, int high, int deltaK) {
11         for (int i = low + deltaK; i <= high; i++)
12             if (r[i]<r[i-deltaK]) {
13             //小于时,需将 r[i] 插入有序表,执行的过程跟插入排序一样
14                 int temp = r[i];
15                 int j ;
16                 for (j= i - deltaK; j >= low && temp < r[j]; j = j - deltaK)
17                     r[j + deltaK] = r[j]; //记录后移
18                 r[j + deltaK] = temp; //插入到正确位置
19                 System.out.println(Arrays.toString(r));
20             }
21
22
23     }

四、时间复杂度分析

希尔排序的运行时间依赖于增量序列的选择,希尔排序的平均情形分析,除最平凡的一些增量序列外,是一个长期未曾解决的问题。我们将对希尔排序的最坏情况分析:

1、使用希尔增量时希尔排序的最坏情形运行时间为O(n2

2、使用Hibbard增量的希尔排序的最坏情况运行时间为O(n3/2):证明略

实践中,大多数希尔排序的运行时间为O(n3/2

五、参考资料

《数据结构与算法分析》

原文地址:https://www.cnblogs.com/zxz123/p/9446365.html

时间: 2024-10-20 00:10:24

插入排序算法之希尔排序的相关文章

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

算法----(6)希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一 1 def shellSort(nums): 2 # 设定步长 3 step = len(nums)//2 4 while step > 0: 5 for i in range(step, len(nums)): 6 # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置

五分钟学会一个高难度算法:希尔排序

前言 由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 ---<图解数据结构>,主要使用动画来描述常见的数据结构和算法.本系列包括十大排序.堆.队列.树.并查集.图等等大概几十篇. 希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率: 但插入排序

经典排序算法之希尔排序

? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.希尔排序适合数据量中等情况,几十个到几万个. ? 网上看了好久才彻底明白希尔排序是什么,简单的说将就是按照步进对数据进行分组,对每组分别进行插入排序,直到步进是1的时候则全部完成.在此感谢 dreamcatcher-cx的博客 的讲解. function sortShell(arr)

python数据结构与算法 33 希尔排序

希尔排序 希尔排序,有时称为递减增量排序,是在插入排序基础上,把列表拆成几个较小的子表,然后对每个子表使用插入排序的方法.选出子表的方法是希尔排序的关键,它并不是把列表的中相近的元素取出来组成子表,而是使用了一个增量值I,有时也叫做"间隙",然后每隔一个间隙选中一个元素来组成子表. 这可以从图6中看出来,列表中有9个元素,如果我们使用增量3,就有3个子表,每个子表单独做插入排序.完成之后的列表如图7,现在看这个表虽然没有完全排序,但对子表排序后,元素已经很接近它们的最终位置. 图6 增

【数据结构与算法】希尔排序

希尔排序的时间复杂度是O(n^1.3)~O(n^2),空间复杂度是O(1). 代码如下: /** * 源码名称: ShellSort.java * 日期:2014-08-11 * 程序功能:希尔排序 * 版权:[email protected] * 作者:A2BGeek */ public class ShellSort { public void shellSort(int[] in) { int length = in.length; int span = length / 2; int i

java排序算法之希尔排序

希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使用一个序列h1,h2,h3...hk来排序. 具体的意思是 第一趟排序比较的是相隔为hk的元素,也就是比较a[i]与a[i+hk],保证a[i]<=a[i+hk]. 第二次比较的是相隔为hk-1的元素,也就是比较a[i]与a[i+hk-1],保证a[i]<=a[i+hk-1]. 直到最后比较的是相

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

一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名.Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔排序的中心思想就是:将数据进行分组,然后对每一组数据进行排序,在每一组数据都有序之后 ,就可以对所有的分组利用插入排序进行最后一次排序.这样可以显著减少交换的次数,以达到加快排序速度的目的.       希尔排序的中心思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离

排序算法:希尔排序

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97, 26,