首页 > 其他分享 >28.希尔排序

28.希尔排序

时间:2023-06-26 12:57:05浏览次数:30  
标签:int 插入排序 28 gap 希尔 增量 序列 排序

插入排序虽好,但是某些特殊情况也有很多缺点,比如像下面这种情况:

169 前的元素基本不用插入操作就已经有序,元素1 和2 的排序几乎要移动数组前面的所有元素!!! 于是,有个老帅哥就提出了优化此问题的希尔排序!
希尔排序是希尔(Donald Shell)于1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。它与插入排序的不同之处在于,它会优先比较距离较远的元素。
希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分成一组,实际上等同于执行一次上面讲过的插入排序,算法便终止。

希尔排序的基本步骤:

选择增量:gap=length/2,缩小增量:gap = gap/2
增量序列:用序列表示增量选择,{n/2, (n/2)/2, …, 1}
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序;
仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。

代码实现:

#include<stdio.h>
#include<stdlib.h>

void ShellSort(int arr[], int len)//希尔排序
{
	int gap = len / 2;

	for (; gap > 0; gap = gap / 2)//增量,依次按除2的范围缩小
	{
		for (int i = gap; i < len; i++)
		{
			int current = arr[i];

			int j = 0;

			for (j = i - gap; j >= 0 && arr[j] > current; j -= gap)
			{
				arr[j + gap] = arr[j];
			}
			arr[j + gap] = current;
		}
	}
}

int main()
{
	int beauties[] = { 163, 161, 158, 165, 171, 170, 163, 159, 162 , 1, 2};

	int len = sizeof(beauties) / sizeof(beauties[0]);

	ShellSort(beauties, len);

	printf("美女排序以后的结果是:\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d ", beauties[i]);
	}

	system("pause");
	return 0;
}

参考资料来源:

奇牛学院

标签:int,插入排序,28,gap,希尔,增量,序列,排序
From: https://www.cnblogs.com/codemagiciant/p/17505352.html

相关文章

  • LLM-Blender:大语言模型排序融合框架
    随着Alpaca,Vicuna,Baize,Koala等诸多大型语言模型的问世,研究人员发现虽然一些模型比如Vicuna的整体的平均表现最优,但是针对每个单独的输入,其最优模型的分布实际上是非常分散的,比如最好的Vicuna也只在20%的任务里比其他模型有优势。有没有可能通过集成学习来综合诸多开源的「......
  • Roop:显卡GPU版软件已就位,速度提升28倍!
    如题,GPU版本已经搞定。我在本地的一台电脑行做了个简单的对比,同一个小视频,CPU要5分多钟,GPU只要12秒。而且,内存的需求量也大幅度降低了。  美队这个架子,给托尼用,也挺不错哦! ​ 这次的版本,准确来说是GPU+CPU都可以,另外是代码更新到了最......
  • 27.插入排序
    自从上次小桂子发现了冒泡排序后,他开始相信自己的聪明才智比伴读小书童居然要高,所以他更加热衷于排序算法研究了,没事的时候,时不时找几个宫女演练一下,这时他又发现了一个新的排序方式,对于一下宫女们的队列:1.首先,我们只考虑第一个元素,从第一个元素171开始,该元素可以认为已经被排......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,st......
  • C++面试八股文:std::array如何实现编译器排序?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std......
  • 26.冒泡排序
    每当皇帝选妃时,首席太监小桂子总是忍不住在旁边偷窥这些候选的美女,有一次他发现做为伴读小书童的你居然犯了个常人都可以轻易看出的错误,有几位候选的美女站成如下一排:当我们采用前面的选择排序时,我们仍然要将候选者遍历5遍,才能完成最终的排序,但其实,本身这些美女除了第一个外,已经......
  • 25.选择排序
    从前有个王国,国王骄奢无度,贪图女色,后宫佳丽三千,但还是动用大量财力物力在全国范围内招妃纳妾,浸淫于女色之中。又是一年的选妃开始,今年国王对身高比较敏感,要求这些候选者按照从低到高的顺序排列,供其选择。。。宫廷首席太监小桂子于是命令所有小公公把宫女的身高都量出来并上报到......
  • 个人博客-给推荐文章添加排序字段
    个人博客-给推荐文章添加排序字段前言前篇文章优化了推荐文章的加载,但是呢,还是不太满意,之前是按照文章的发布日期去排序的,既然是推荐文章,还是得用一个字段去专门管理顺序。设计思路:给推荐文章表添加一个排序字段,然后写一个修改方法即可。数据库字段这里的数据类型以sqlite3......
  • 283. 移动零
    给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]>代码classSolution{public:voidmoveZeroes(vector<int>&nu......
  • 国标GB28181协议客户端开发(二)程序架构和注册
    国标GB28181协议客户端开发(二)程序架构和注册本系列文章旨在探讨国标GB28181协议设备端的开发过程。本文将聚焦于架构设计和设备注册,并详细介绍了设备端的程序架构设计、exosip库介绍和接口分类,以及GB28181设备端的注册流程和信令交互报文。通过阅读本文,读者将深入了解GB28181协......