首页 > 系统相关 >排序算法 希尔排序 ShellSort -- C语言实现

排序算法 希尔排序 ShellSort -- C语言实现

时间:2024-08-06 21:55:52浏览次数:18  
标签:end C语言 -- 插入排序 gap int 序列 排序

希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

算法步骤

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列个数 k,对序列进行 k 趟排序;

每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

代码实现

void ShellSort(int *a, int n)
{
	int gap = n ;
		while (gap > 1)
	{ 
			//gap /= 2;
			gap = gap/3+1;
		for (int i = 0; i < n - gap; i += 1)  //n个数排列,只需排n-1个,(因为第一个必定有序--默认)
		{
			/*第一个数排序*/
			int end = i;  //下标 , 已排序数组【0 - end】
			int tmp = a[end + gap];  //要插入的数

			//一个元素排序,排一个数(先假想出一堆乱序数组)
			while (end >= 0)
			{
				/*挪动一次*/
				if (a[end] > tmp)
				{
					a[end + gap] = a[end]; //往后挪动
					end -= gap;   //比下一个元素
				}
				else
				{
					break; //插入
				}
			}
			a[end + gap] = tmp; //插在end后面
		}
	}
}

标签:end,C语言,--,插入排序,gap,int,序列,排序
From: https://www.cnblogs.com/DSCL-ing/p/18345464

相关文章

  • java学习一周小知识
    java初学习appletJavaApplet可以大大提高Web页面的交互能力和动态执行能力。包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页。当Applet用户访问这样的网页时,Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络浏览器。由于Applet是在用户的......
  • HTML 段落
    您已经很好地概述了HTML中段落(<p>标签)和折行(<br/>标签)的基本用法和注意事项。这里是对您内容的进一步补充和澄清:HTML段落<p>标签用于定义HTML文档中的段落。浏览器会自动在段落的前后添加空行(垂直边距),这是由浏览器的默认样式表(CSS)控制的。这有助于区分页面上的不同段落,使得内......
  • 【linux】关于qemu-img创建虚拟机前端磁盘报错
    问题描述:使用qemu-imgcreate-fqcow2-bcirros.qcow2vmhost.img20G创建虚拟机磁盘出现以下报错,报错内容:qemu-img:vmhost.img:BackingfilespecifiedwithoutbackingformatDetectedformatofqcow2.[root@ecsimages]#qemu-imgcreate-fqcow2-bcirros.qcow2vmho......
  • 盖世计划--0806--B班训练
    A我的题解B神秘题根据2008年集训队论文可以给出\(O(n)\)做法,不会。考虑从\(k\)小的情况出发。当\(k=1\)时,结论:当且仅当\(n\)为\(2\)的幂次时,先手必败。可以通过二进制构造方案求解。当\(k=2\)时,结论:当且仅当\(n\)为斐波那契数时先手必败。将每个数通过斐波......
  • LangChain与CI/CD的无缝对接:自动化部署的新前沿
    LangChain与CI/CD的无缝对接:自动化部署的新前沿在当今快速发展的软件开发领域,持续集成/持续部署(CI/CD)已成为提升开发效率和软件质量的关键实践。LangChain,作为一个假设的编程辅助工具,如果存在,它可能会与CI/CD流程紧密集成,以实现代码生成、测试和部署的自动化。本文将探讨La......
  • 《LeetCode热题100》---<5.②普通数组篇五道>
    本篇博客讲解LeetCode热题100道普通数组篇中的五道题第三道:轮转数组(中等)第四道:除自身以外数组的乘积(中等)第三道:轮转数组(中等) 方法一:使用额外的数组classSolution{publicvoidrotate(int[]nums,intk){intlen=nums.length;int[]newAr......
  • WSL2Linux 子系统(九)
    WSL挂载硬盘/U盘/SD卡上一篇文章《WSL2Linux子系统(八)》讲解WSL与Windows之间端口转发规则和正向端口代理。《WSL2Linux子系统(六)》中仅仅简单讲解WSL(WindowsSubsystemforLinux)挂载硬盘,本篇继续详细讲解几种常见硬盘挂载使用。挂载外部硬盘到WSL不仅可以扩......
  • python爬虫预备知识三-多进程
    python实现多进程的方法:fork、multiprocessing模块创建多进程。os.fork方法os.fork方法只适合于unix/linux系统,不支持windows系统。fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,fork方法分别在父进程和子进程中......
  • C语言典型例题28
    《C程序设计教程(第四版)——谭浩强》习题2.5输入一个华氏温度,要求输出摄氏温度。公式为C=5/9(F-32),要求输出要有文字说明,取两位小数数学知识:(1)华氏温度与摄氏温度(FahrenheittemperatureandCelsiustemperature),是两大国际主流的计量温度的标准。(2)华氏温标由来华氏温标:......
  • PEP 8 – Python 代码风格指南中文版(七)
    编程建议(2) 定义异常时,应该从Exception类继承,而不是从BaseException类继承。直接从BaseException继承的异常通常是那些几乎不应该被捕获的异常。设计异常层次结构时,应该基于捕获异常的代码可能需要进行的区分,而不是基于异常被抛出的位置。目标是通过编程方式回答“出了......