首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏ACM算法日常

    基础算法|7 希尔排序 HDU 1425

    ---- 希尔排序 让我们回想一下直接插入排序算法,是不是每次都是讲一个待排序的元素按顺序插入到一个有序序列中。 ---- 希尔排序的算法思想 希尔排序通过一个增量序列(最后一个增量必须为1),按逐个增量将待排序序列划分为若干个组,然后对每个组中的两个元素进行排序(第一次改进,使待排序元素数量较少),这样通过每个增量划分成的组通过排序之后 ---- 希尔排序的实现过程 例如,我们要对序列[8,6,10,13,5,7]进行希尔排序,我可以选取增量序列,d1=3,d2=1。 按第一个增量d1分组,我们可以分为3组——8与13,6与5,10与7(间隔数均为3),对每个组进行一次排序,8小于13所以8和13的位置不变;6大于5,所以6与5交换位置,得到序列[8,5,10,13,6,7 ];同理10大于7,交换位置得到序列[8,5,7,13,6,10]。

    65920发布于 2018-11-23
  • 来自专栏云霄雨霁

    排序----希尔排序

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

    1.1K00发布于 2018-05-30
  • 来自专栏若尘的技术专栏

    排序——希尔排序

    希尔排序(基于逐趟缩小增量) 基本思想 先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。 [在这里插入图片描述] 算法实现 void ShellSort(SqList &L, int dlta[], int t){ // 按增量序列dlta[0…t-1]对顺序表L作Shell排序 for (k = 0; k < t; k++) ShellInsert(L, dlta[k]); // 增量为dlta[k]的一趟插入排序 } void ShellInsert(SqList &L, int dk){ // 对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子 for(i = dk + 1; i <= L.length; i++){ // 开始将r[i] 插入有序增量子表

    997105发布于 2021-06-30
  • 来自专栏趣谈编程

    希尔排序

    希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 排序思想 前情回顾:直接插入排序(对插入排序不熟悉的强烈建议先阅读此文 其实希尔排序就可以实现这个效果 希尔排序是怎么做的呢? ? ? 一尘 ? 慧能 ? 同理,对这仅有的一组数据进行排序排序完成 希尔排序真厉害啊,同时构造出两个特殊条件以达到高效插入 ? ? 一尘 ? 慧能 ? 恩恩,这就是希尔排序的精华所在 排序代码 ? 慧能 ? 既然知道了思想,那你写一写代码吧 对于已经熟悉插入排序的一尘来说这并不是什么难事,很快,一尘写出了希尔排序的代码 ? {1,3,7,...,2^k-1},这种序列的时间复杂度(最坏情形)为O(n^1.5) Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109

    53660发布于 2018-06-13
  • 来自专栏c++与qt学习

    希尔排序

    希尔排序是对插入排序的改进算法,主要针对插入排序需要在数组基本有序或者数量较少时才会效率较高的这两个限制进行改进 希尔排序基本思想 希尔排序的过程图解 如何分割待排序记录? 子序列内如何进行直接插入排序? 算法描述: 直接插入排序希尔排序的对比 时间性能 手绘图解加上完整代码 下面就是重复上述步骤,这里不做演示了 #include<iostream> using namespace std; //希尔排序 void shellSort(int arr[],int len) { for (int d=len/2; d >= 1; d/=2) { for (int i = d temp; } } } void test() { int arr[] = { 40,25,49,25,16,21,8,30,13 }; shellSort(arr,9); cout << "希尔排序

    25020编辑于 2022-05-05
  • 来自专栏技术面面观

    希尔排序

    希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 排序思想 前情回顾:直接插入排序(对插入排序不熟悉的强烈建议先阅读此文 其实希尔排序就可以实现这个效果 希尔排序是怎么做的呢? ? ? 一尘 ? 慧能 ? 同理,对这仅有的一组数据进行排序排序完成 希尔排序真厉害啊,同时构造出两个特殊条件以达到高效插入 ? ? 一尘 ? 慧能 ? 恩恩,这就是希尔排序的精华所在 排序代码 ? 慧能 ? 既然知道了思想,那你写一写代码吧 对于已经熟悉插入排序的一尘来说这并不是什么难事,很快,一尘写出了希尔排序的代码 ? {1,3,7,...,2^k-1},这种序列的时间复杂度(最坏情形)为O(n^1.5) Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109

    53410发布于 2019-12-12
  • 来自专栏哈雷彗星撞地球

    希尔排序

    希尔排序(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 排序后的数组

    78840发布于 2019-05-15
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    希尔排序

    使用希尔增量时排序的最坏为:O(n^2); 代码如下: 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 template <typename Comparable> 5 void shellsort(vector<Comparable> & a) 6 { 7 for(int gap = a.size()/2 ivec.push_back(13); 31 ivec.push_back(6); 32 ivec.push_back(14); 33 ivec.push_back(7)

    68970发布于 2018-01-17
  • 来自专栏软件开发 -- 分享 互助 成长

    希尔排序

    1、希尔排序介绍 希尔排序是对直接插入排序算法的一种改进,当记录较少或者记录本身基本有序的时候直接插入排序的优势非常明显,所以希尔排序就是通过人为的创造这两个条件,然后进行插入排序,基本思想是设置一个增量 引用一个别人的博文的例子“经典排序算法 - 希尔排序Shell sort ”  准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组 : // 希尔排序.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; //输入数组的名字和长度,然后用希尔排序方法进行排序 void shell_sort ; } } } } int _tmain(int argc, _TCHAR* argv[]) { int a[10]={3,9,1,5,8,3,7,4,6,2

    74080发布于 2018-02-05
  • 来自专栏JavaEE

    排序算法 --- 希尔排序

    一、排序思想 之前说到插入排序希尔排序就对其进行了一个优化,优化的思路是: 对待排序列进行分组,组数为gap = arr.length / 2; 对每一组进行插入排序,然后再进行分组,gap = gap ---- 案例: 假如有待排序列如下: 8 9 1 7 2 3 5 4 6 0 总共10个数,gap = 10 / 2 = 5,分成5组,并且不是两两相邻的为一组,arr[0]和arr 2$ 对这两组分别进行插入排序,结果就是: 0* 2$ 1* 4$ 3* 5$ 7* 6$ 8* 9$ 此时,gap = gap / 2 二、代码实现 关于希尔的代码实现,网上很多花里胡哨的答案,什么交换法位移法之类的,其实不要想得那么复杂。 刚才说了,希尔排序的主要思想就是分组,对每一组分别进行插入排序,那代码就简单了,就是这分组里面将之前插入排序的代码拷过来稍微改改就行了。

    75431发布于 2020-10-10
  • 来自专栏学习C/++

    排序算法】希尔排序

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

    53710编辑于 2024-03-30
  • 来自专栏静默虚空的博客

    排序希尔排序

    所以,希尔排序是不稳定的算法。 这项研究也表明“比较在希尔排序中是最主要的操作,而不是交换。”用这样步长序列的希尔排序比插入排序和堆排序都要快,甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。 算法稳定性 由上文的希尔排序算法演示图即可知,希尔排序中相等数据可能会交换位置,所以希尔排序是不稳定的算法。 直接插入排序希尔排序的比较 直接插入排序是稳定的;而希尔排序是不稳定的。 5    9    8    6    5    7     gap = 2:    2    1    4    3    5    6    5    7    8    9     gap = 7    8    9    参考资料 《数据结构习题与解析》(B级第3版) 维基百科-希尔排序:http://zh.wikipedia.org/zh-cn/%E5%B8%8C%E5%B0%94%E6%

    1.2K90发布于 2018-01-05
  • 来自专栏从零开始的Code生活

    希尔排序

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

    32910编辑于 2022-01-13
  • 来自专栏Vegout

    希尔排序

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

    59830发布于 2019-07-03
  • 来自专栏python-爬虫

    希尔排序

    一.思想 希尔排序是一种分组插入排序算法。 首先取一个整数d1=n/2,将元素分为d1个为一组,每组相邻量元素之间距离为d1,两组数据一一进行对比按大小,从新分配两组 如[1,3,0,2] 第一次排序后变成[0,2,1,3] 取第二个整数d2=d1 /2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。 按上面那个简单例子走第二次排序为 [0,2,1,3]按间隔1进行对比第一次然后依次变成 0与2比,0比2小顺序不变 [0,2,1,3] 2与1比,1比2小1去前面 [0,1,2,3] 依次类推...全部走完就是排好了

    32230编辑于 2022-05-09
  • 来自专栏AI那点小事

    希尔排序

    概述 由于之前的冒泡排序和插入排序效率低平均复杂度为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

    44420编辑于 2022-06-15
  • 来自专栏数据结构与算法分享

    希尔排序

    最近在全面学习数据结构,常用算法记录:希尔排序,基本思想是选定一个增量 d<nd 的元素为一组),然后在各个子序列内进行插入排序,完成后缩小增量 d'(d'<d)d = 1 为止,此时就成了标准的插入排序 ,但此时大部分元素已经有序,只需要少量操作,甚至不用操作即可完成排序。 该排序算法为不稳定排序希尔排序还是比较绕的,需要多看看,多画一画。 最坏时间复杂度:O(n^2)n 在某范围内可达:O(n^{1.3})目前无法用数学手段证明确切的时间复杂度。 iostream> using namespace std; void shellSort(int arr[], int n); int main() { int arr[] = {-1, 5, 7,

    42310编辑于 2022-09-19
  • 来自专栏hotarugaliの技术分享

    希尔排序

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

    31710编辑于 2022-03-01
  • 来自专栏JusterZhu

    希尔排序

    1.概要 希尔排序希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,他是简单插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序希尔排序算法基本思想 希尔排序是吧记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 class Program { static void Main(string[] args) { int[] array = { 8,9,1,7,2,3,5,4,6,0

    33720编辑于 2022-12-07
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    希尔排序

    希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。 算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。 在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。 } } } 全部代码: #include <stdio.h> #include <stdlib.h> #include <time.h> int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5 }; int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9}; int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0}; void copy(int

    55550发布于 2018-01-17
领券