首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

希尔排序

希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 排序思想 前情回顾:直接插入排序(对插入排序不熟悉的强烈建议先阅读此文...其实希尔排序就可以实现这个效果 希尔排序是怎么做的呢? ? ? 一尘 ? 慧能 ?...同理,对这仅有的一组数据进行排序排序完成 希尔排序真厉害啊,同时构造出两个特殊条件以达到高效插入 ? ? 一尘 ? 慧能 ? 恩恩,这就是希尔排序的精华所在 排序代码 ? 慧能 ?...既然知道了思想,那你写一写代码吧 对于已经熟悉插入排序的一尘来说这并不是什么难事,很快,一尘写出了希尔排序的代码 ?...最后说一下稳定性吧 不是稳定的,虽然插入排序是稳定的,但是希尔排序在插入的时候是跳跃性插入的,有可能破坏稳定性 ? ? 一尘 ?

37660

排序----希尔排序

上一篇:插入排序 希尔排序的思想是:使数组中任意间隔为h的元素都是有序的。这样的数组成为h有序数组。换句话说,一个h数组就是h个互相独立的有序数组 编织在一起组成的数组。...实现希尔排序的一种方法是对于每个h,使用插入排序将h个子数组独立地排序。然后按某种次序递减h,可以实现数组整体排序。这里出现两个问题:为什么使用插入排序而不是选择排序?按哪种次序递减h?...希尔排序是对直接插入排序的改进,它权衡了子数组的规模和有序性。它避免了直接插入排序主键最小的元素正好在数组的尽头,要将它挪动到正确的位置需要移动次数很多的问题。...希尔排序的算法性能不仅取决于h,还取决于h之间的数学性质,比如它们的公因子等。 希尔排序的用时是次平方级别的,目前发现希尔排序最坏情况也达不到平方级别,是N^1.5次方。...” } 从希尔排序可以发现,我们对插入排序稍微改动,就在效率上取得了极大的提升,算法的魅力正在于此。

83200
您找到你想要的搜索结果了吗?
是的
没有找到

希尔排序

希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 排序思想 前情回顾:直接插入排序(对插入排序不熟悉的强烈建议先阅读此文...其实希尔排序就可以实现这个效果 希尔排序是怎么做的呢? ? ? 一尘 ? 慧能 ?...同理,对这仅有的一组数据进行排序排序完成 希尔排序真厉害啊,同时构造出两个特殊条件以达到高效插入 ? ? 一尘 ? 慧能 ? 恩恩,这就是希尔排序的精华所在 排序代码 ? 慧能 ?...既然知道了思想,那你写一写代码吧 对于已经熟悉插入排序的一尘来说这并不是什么难事,很快,一尘写出了希尔排序的代码 ?...最后说一下稳定性吧 不是稳定的,虽然插入排序是稳定的,但是希尔排序在插入的时候是跳跃性插入的,有可能破坏稳定性 ? ? 一尘 ? 关于稳定性可看:冒泡排序(文末有) 说完,一尘继续玩起了扑克

41910

希尔排序

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。...希尔排序的OC实现 /** 希尔排序 @param randomNumbers 随机数数组 @return 排序后的数组 */ + (NSMutableArray *)shellSort:(...希尔排序的时间复杂度与增量序列的选取有关,Hibbard增量的希尔排序的时间复杂度为O(n3/2),希尔排序时间复杂度的下界是n*log2n。...希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择,但是比O(n2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。...所以,如果我们对希尔排序的增量序列进行优化,排序算法的时间会稍微减少一点点: /** 希尔排序(对区间算法优化) @param randomNumbers 随机数数组 @return 排序后的数组

54040

希尔排序

1、希尔排序介绍 希尔排序是对直接插入排序算法的一种改进,当记录较少或者记录本身基本有序的时候直接插入排序的优势非常明显,所以希尔排序就是通过人为的创造这两个条件,然后进行插入排序,基本思想是设置一个增量...引用一个别人的博文的例子“经典排序算法 - 希尔排序Shell sort ”  准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组...[1 2 4]都不用动,过程省略,到5的时候,将5取出,在前边的有序数组里找到适合它的位置插入,就是4后边,6前边 后边的也不用改,所以排序完毕 顺序输出结果:[1 2 4 5 6 9] 2、希尔排序的关键是如何取关键字...: // 希尔排序.cpp : 定义控制台应用程序的入口点。...// #include "stdafx.h" #include using namespace std; //输入数组的名字和长度,然后用希尔排序方法进行排序 void shell_sort

52380

排序算法】希尔排序

希尔排序( 缩小增量排序 ) 希尔排序是一种经典的排序算法,它通过多次插入排序的方式,以及逐步缩小增量的策略,实现对数据的高效排序希尔排序法又称缩小增量法。...分组思想 希尔排序的核心思想在于将待排序的数据分成若干组,对每一组数据进行插入排序。这样做的好处是,一方面可以减少数据的比较次数和移动次数,另一方面可以利用已经部分有序的性质,加速排序的过程。...缩小增量的过程 希尔排序的另一个关键点是逐步缩小增量的过程。初始时,增量的值通常为数组长度的一半。随着排序的进行,增量逐步减小,直到增量为1,完成最后一次排序。...排序步骤 希尔排序排序步骤可以分为以下几个阶段: 分组排序:初始时,根据设定的增量将数据分成若干组,对每组数据进行插入排序,使得每组数据都部分有序。...: 希尔排序是对直接插入排序的优化。

5010

排序算法 --- 希尔排序

一、排序思想 之前说到插入排序希尔排序就对其进行了一个优化,优化的思路是: 对待排序列进行分组,组数为gap = arr.length / 2; 对每一组进行插入排序,然后再进行分组,gap = gap.../ 2; 再对每一组进行插入排序,直到最后组数为1,再进行最后一次插入排序即可; ---- 欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新...,那么整个排序过程就完了。...二、代码实现 关于希尔的代码实现,网上很多花里胡哨的答案,什么交换法位移法之类的,其实不要想得那么复杂。...刚才说了,希尔排序的主要思想就是分组,对每一组分别进行插入排序,那代码就简单了,就是这分组里面将之前插入排序的代码拷过来稍微改改就行了。

46931

排序希尔排序

希尔排序的基本思想是: 把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。...所以,希尔排序是不稳定的算法。...这项研究也表明“比较在希尔排序中是最主要的操作,而不是交换。”用这样步长序列的希尔排序比插入排序和堆排序都要快,甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。...算法稳定性 由上文的希尔排序算法演示图即可知,希尔排序中相等数据可能会交换位置,所以希尔排序是不稳定的算法。 直接插入排序希尔排序的比较 直接插入排序是稳定的;而希尔排序是不稳定的。...直接插入排序更适合于原始记录基本有序的集合。 希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。 在希尔排序中,增量序列gap的取法必须满足:最后一个步长必须是 1 。

83990

希尔排序

为了展示初级排序算法性质的价值,接下来我们将学习一种基于插入排序的快速的排序算法。 对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。...希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。 实现希尔排序的一种方法是对于每个h,用插入排序将h个子数组独立地排序。...只需要在插人排序的代码中将移动元素的距离由1改为h即可。这样,希尔排序的实现就转化为了一个类似于插人排序但使用不同增量的过程。...希尔排序为插入排序高级版,先把几个部分的数组用插入排序排好,然后再把这几个分散数组排序成有序数组。...确定一个增量h(h可以是数组总长/3 or /2),每次循环完增量变小直到为1,每次把分散的数组整合成一个大的有序数组,直到增量为1时,整个数组排序完成。

21110

希尔排序

希尔排序 如果上一篇初级排序算法中的插入排序你已经熟悉,那么今天的这个希尔排序对你来说就要简单一些。希尔排序,就是使用不同增量进行一遍一遍的插入排序排序算法。首先,增量是什么?...希尔排序的思想就是使数组中任意间隔为h的元素都要有序,间隔h就是增量,之所以叫他增量,是因为他是在不断变化的。...插入排序中比较的是array[j]和array[j-1],所以说,希尔排序就是使用不同增量的插入排序算法。当然,也由于希尔排序可以使用不同增量,于是透彻的理解希尔排序的性能仍旧是个巨大的挑战。...希尔排序比之前初级排序算法中的排序算法都要快,并且,数组越大,优势越大。但为什么呢?从数学方面的证明还是等专家们去做吧,我只能举个栗子。...比如有一个特别长的整型数组,特别小的数排在了最后边,插入排序的话它就需要一点一点的挪到前面,而希尔排序则是跳过来的,一次跳多远呢?

45830

希尔排序

概述 由于之前的冒泡排序和插入排序效率低平均复杂度为O(n^2),那么为了加快排序效率,希尔排序就这样被提出来了。...因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比插入排序和冒泡排序的效率高。 那么对于增量的选择各种各样,选择的好坏会直接影响希尔排序的效率。...首先先看个坏例子 那么好的增量必须前后不互质,那么下面有几个著名增量序列: 那么基于Sedgewick增量序列的希尔排序算法如下: //希尔排序 void Shell_Sort(...size) { for(int i = 0 ; i < size ; i++){ cout<<data[i]<<" "; } cout<<endl; } //希尔排序...:"<<endl; Print(data,size); cout<<"希尔排序后:"<<endl; Shell_Sort(data,size); Print(data,size

23920

希尔排序

简介 希尔排序又称缩小增量排序,其也属于插入排序类算法。相较于一般的插入算法、折半插入算法、2-路插入算法以及表插入算法,希尔排序在时间效率上更加优秀。 2....伪代码 ShellSort(A, D) { // 按增量序列 D 对数组 A 进行希尔排序 for i = 1 to D.length // 以下类比与一般的插入排序,...常用的增量序列有: 希尔排序时间复杂度 。 希尔排序时间复杂度 。 希尔排序时间复杂度 。 希尔排序时间复杂度 。...希尔排序时间复杂度 。 希尔排序时间复杂度 。 , , 递减到 0(即连续递减到 1 的光滑数 ) 希尔排序时间复杂度 。 希尔排序是不稳定的、原址的。...不稳定原因在于希尔排序中不同段交换元素时会打乱相等元素初始的相对位置。 4.

16410
领券