希尔排序(重点讲解如何分组)---------通俗易懂,直击重点!!!

本文介绍了希尔排序的历史、原理及其实现过程。希尔排序是一种基于插入排序的算法,通过设置步长gap对数组进行分组排序,逐步缩小步长直至为1,完成整个排序。在理解希尔排序前,需要掌握直接插入排序。文中提供了详细的代码实例,帮助读者更好地理解和应用希尔排序。
摘要由CSDN通过智能技术生成


希尔排序的历史

希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。
1、希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。


提示:以下是本篇文章正文内容,下面案例可供参考

一、关于希尔排序

1、由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
2、虽然希尔排序的稳定性比较差,但是希尔排序是冲破二次时间屏障的第一批算法之一。
3、简单说一下希尔排序的思路,就我的理解而言:希尔排序首先先分组【我自己称之为“希尔分组”】,之后把分好的组别分别按照直接插入排序的算法来进行排序。【当我自己学习该算法的时候,我首先先列一个数组,之后分组,然后往纸上写代码,找不同分组的共性,然后统一成一片代码】
4、另外强调一点的是,学习该算法之前必须完全先掌握直接插入排序算法。因为希尔算法实在该基础上进行排序的。

链接: 【直接插入排序算法】.

二、希尔排序的思路

、希尔排序:“希尔分组”是根据步长【gap】来分的。


假设有一个数组 {1 ,2,3,4,5,6,7,8,9,0}
第一大组:步长gap=length/2=5;
。。。。。分成五小组,每组有2个数
第二大组:gap=gap/2=5/2=2;
。。。。。分成两小组,每组有5个数
第三大组:gap=gap/2=2/2=1;【直到步长gap=1,才算结束】
。。。。。分成一个组,每组有10个数

、之后就分别对以上各个小组用直接插入排序就可以了。

三、代码实例讲解

代码如下(示例):

void ShellSort(int a[],int length){

	int gap;          //步长
	int i,j,temp,x;
	
	for(gap=length/2;gap>0;gap=gap/2){    //第一个for循环是看需要几次“希尔分组”【注意:每次“希尔分组”直接开始对其进行直接插入排序】
		for(i=0;i<gap;i++){     //第二个for循环是对分组后,就这个大组中有几个小组,就循环几次
			for(j=i+gap;j<length;j=j+gap){    //剩下两个for循环是对那个小组进行的直接插入排序
				for(x=j;x>0;x=x-gap){
					if(a[x]<a[x-gap]){
						temp=a[x-gap];
						a[x-gap]=a[x];
						a[x]=temp;
					}
					else break;   //一定记住:再次强调,一旦一不小心忘了带,
					             //你就需要像我一样进行,长达两三个小时的查错。
					
				}
			}
		}
	}
	
}

总结

。。目前对于希尔排序我就写这么多,我希望看懂的哥们儿自己再总结一边,然后自己写下这个代码。【你不一定写的和我一毛一样,我就和一大部分人写算法程序不一样,但是思路是一样的。虽然有时候自己根据理解写的代码,有可能编译时间很长,但是这也是一种进步。这说明我可以写出自己的代码了,相当于我自己生了个孩子,我骄傲,即使他不是很完美。【博主是男生】,,,,但是在编程的路上我可以把它变得完美】

【还是那句话,一定要自己根据理解自己干一边代码。我相信我们以后会变得越来越好】
【兄弟姐妹们,加油!!!】

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,我可以为你解答关于希尔排序的问题。希尔排序是插入排序的一种改进算法,也被称为“缩小增量排序”。它的基本思想是将待排序的序列按照一定的间隔分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小间隔,直到间隔为1,最后对整个序列进行一次插入排序。 希尔排序的时间复杂度与间隔序列的选择有关,最坏时间复杂度为$O(n^2)$,平均时间复杂度为$O(n \log n)$。相比于插入排序,希尔排序的时间复杂度有了明显的提升,且其在实际应用中也表现得比插入排序好。 下面是希尔排序的示例代码: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 return arr ``` 在这段代码中,我们首先定义了一个希尔排序的函数shell_sort,它接收一个列表arr作为参数,并返回排好序的列表。在函数中,我们首先获取列表的长度n和初始的间隔gap,然后开始循环,直到间隔为1为止。在每次循环中,我们将列表按照间隔分成若干个子序列,对每个子序列进行插入排序,将子序列按照升序排列。最后,我们将间隔除以2,继续循环直到间隔为1。 使用希尔排序对列表进行排序非常简单,只需要调用shell_sort函数即可。例如,我们可以这样调用函数: ```python arr = [5, 2, 8, 3, 1, 6] sorted_arr = shell_sort(arr) print(sorted_arr) ``` 这段代码会输出排好序的列表[1, 2, 3, 5, 6, 8]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Song ZiJian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值