【初阶数据结构题目】32. 希尔排序

news2024/12/23 0:34:43

文章目录

    • 希尔排序
    • 希尔排序的时间复杂度计算


希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap = n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。

6ae8699dc6d8ad8456fb7c3a8f859d8a

第一趟排序:n=10,gap=n/2=5

分成五组,每组都用直接插入排序。

end一开始放在9的位置上,tmp放在4的位置上

第二趟排序:gap=5,gap=gap/3+1=2

分成两组,每组都用直接插入排序。

end一开始放在4的位置上,tmp放在2的位置上

第三趟排序:gap=2,gap=gap/3+1=1

直接插入排序

希尔排序的特性总结

  1. 希尔排序是对直接插入排序的优化。

  2. gap > 1 时都是预排序,目的是让数组更接近于有序。

    gap == 1 时,数组已经接近有序的了,直接插入排序。

代码实现:

Sort.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>

//打印
void PrintArr(int* arr, int n);

//希尔排序
void ShellSort(int* arr, int n);

Sort.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Sort.h"

//打印
void PrintArr(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//希尔排序时间复杂度:O(n^1.3)
void ShellSort(int* arr, int n)
{
	int gap = n;//6

	while (gap > 1)
	{
		gap = gap / 3 + 1;//保证最后一次gap一定为1
		for (int i = 0; i < n - gap; i++)// i < n - gap是为了防止下面的tmp访问数组元素越界
		{
			int end = i;//n - gap - 1
			int tmp = arr[end + gap];//n - 1
			while (end >= 0)
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else {
					break;
				}
			}
			//也就是arr[end] = tmp;
			arr[end + gap] = tmp;
		}
	}
}

test.c

int main()
{
	int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };
	int n = sizeof(a) / sizeof(int);
	printf("排序前:");
	PrintArr(a, n);

	ShellSort(a,n);

	printf("排序后:");
	PrintArr(a, n);

	return 0;
}

希尔排序的时间复杂度计算

希尔排序的时间复杂度估算:

外层循环:

外层循环的时间复杂度可以直接给出为:O(log2n) 或者O(log3n) ,即O(log n)

内层循环:

670ebd1fc04e8fab0c37556499d071aa

cac68abf89ec2c0126176e780d2f1a3d

通过以上的分析,可以画出这样的曲线图:

00dced09917cb9b8965b510d27e4273b

因此,希尔排序在最初和最后的排序的次数都为n,即前一阶段排序次数是逐渐上升的状态,当到达某一顶点时,排序次数逐渐下降至n,而该顶点的计算暂时无法给出具体的计算过程。

希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。《数据结构(C语言版)》— 严蔚敏书中给出的时间复杂度为:

af7bae58aa0cb803f91113295388da7a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全国10米分辨率逐年植被覆盖度(FVC)数据集

本数据集包括2017至2023年间&#xff0c;全国植被覆盖度数据&#xff0c;FVC范围值为0-1&#xff0c;数据为浮点型&#xff0c;GeoTIFF格式。GeoTIFF文件均可用ArcGIS软件和GDAL读取和打开。 植被覆盖度是指植被&#xff08;包括叶、茎、枝&#xff09;在地面的垂直投影面积占统…

系统编程-进程初步2

进程初步2 目录 进程初步2 1、进程等待清理函数&#xff08;wait&#xff09; 2、等待指定的子进程&#xff08;waitpid&#xff09; 3、新的开辟进程的函数&#xff08;vfork&#xff09; 4、在程序中运行系统下的指令&#xff08;system&#xff09; 5、exec 函数族 …

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么&#xff1f; 7>>结语 1>>前言 今天我会继续分享一些我做的笔记&#xff0c;以及我对指针的理解&#xff0c; 后续会…

查看会议所属CCF级别(A/B/C类会议)

步骤&#xff1a; 1、打开中国计算机学会官网&#xff1a;中国计算机学会 (ccf.org.cn)。 2、搜索框中输入会议名称&#xff0c;例如&#xff1a;SIGKDD。 3、点击打开如图所示来源是“学术评价”的网页。 4、进入如下页面。 可以看到&#xff0c;SIGKDD是CCF A类会议。 参考…

低代码: 关于Test Driven Development - 测试驱动开发组件与测试示例

TDD 的开发方式 Test Driven Development - 测试驱动开发这是一种非常有意思的开发方式,我们进入一个实际场景,拿需要自研的colorpicker表单组件来说表单中的很多属性,都需要进行一个颜色的选择,如背景颜色,字体颜色等等我们来看一下相关设计交互在这里我们分两个图,点击…

python的导入包飘红

本文是mac的解决方法 1、点击pycharm-preferences-paython interpreter 直接搜索你要导入的包名&#xff0c;选择版本号点击 install 2、第二种方法是命令 pip3 install pandas2.2.2

学习文件IO,让你从操作系统内核的角度去理解输入和输出(理论篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

day06——前后端交互

一、计算属性 计算属性就是基于现有的数据推算出来的新属性&#xff0c;只要依赖的数据变化&#xff0c;新属性就会自动更新&#xff0c;而且计算属性多次调用的情况下只会计算一次&#xff0c;效率非常高 简化写法 const app new Vue({ el: #app, data: {}, methods: {//跟da…

易境通海运系统:打造海运专线稳定合作的强力引擎

对于海运专线而言&#xff0c;稳定的合作伙伴至关重要。在激烈的市场竞争中&#xff0c;如何持续保持客户的高满意度&#xff0c;不断强化自身优势&#xff0c;并提升用户粘性&#xff0c;是众多海运专线必须面对并解决的问题。而拥有一套可靠的系统&#xff0c;提供完备的服务…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

Loop Map 循环的几种方法

参考 Using entrySet() public void iterateUsingEntrySet(Map<String, Integer> map) {for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() ":" entry.getValue());} } Iterator<Map.Entry<String…

Apache CloudStack Official Document 翻译节选(七)

关于 Apache CloudStack 的 最佳实践 &#xff08;一&#xff09; Best Practices 部署Apache CloudStack是极具挑战性的&#xff0c;在整个部署过程中需要你做出形形色色的技术性选择。Apache CloudStack的配置条目是相当灵活的&#xff0c;这是因为在组合和配置具体条目时有…

手机谷歌浏览器怎么用

谷歌浏览器不仅在PC端受欢迎&#xff0c;在移动端也是广泛应用的。为了帮助大家更好的理解和使用手机谷歌浏览器&#xff0c;本文将详细介绍如何使用手机谷歌浏览器&#xff0c;对这款浏览器感到陌生的话就快快学起来吧。&#xff08;本文由https://chrome.cmrrs.com/站点的作者…

动手学深度学习7.6 残差网络(ResNet)-笔记练习(PyTorch)

本节课程地址&#xff1a;29 残差网络 ResNet【动手学深度学习v2】_哔哩哔哩_bilibili 29.2 ResNet为什么能训练出1000层的模型【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;7.6. 残差网络&#xff08;ResNet&#xff09; — 动手学深度学习 2.0.0 docume…

制造企业MES系统质检管理的应用

MES系统在质检管理中的作用 MES系统通过集成生产过程中的各个环节&#xff0c;实现对产品质量的全面监控和管理。其在质检管理中的作用主要体现在以下几个方面&#xff1a; 1. 实时数据采集&#xff1a;MES系统能够实时收集生产线上的质量数据&#xff0c;包括但不限于产品尺…

知识改变命运 数据结构【栈和队列面试题】

1.最小栈 class MinStack {Stack <Integer>stack;Stack <Integer>minStack; public MinStack() {stacknew Stack<>();minStacknew Stack<>();}public void push(int val) {stack.push(val);if(minStack.empty()) {minStack.push(val);} else {int top…

汇昌联信科技做拼多多电商怎么提升浏览量?

随着电子商务的蓬勃发展&#xff0c;各大平台之间的竞争变得日益激烈。在这样的背景下&#xff0c;汇昌联信科技如何通过有效的策略来提升其在拼多多平台上的店铺浏览量&#xff0c;成为了一个值得深入探讨的问题。提升浏览量不仅能够增加商品的曝光率&#xff0c;还能有效提高…

【设计模式】六大原则-下

❓首先什么是设计模式&#xff1f; &#x1f635;相信刚上大学的你和我一样&#xff0c;在学习这门课的时候根本不了解这些设计原则和模式有什么用处&#xff0c;反而不如隔壁的C更有意思&#xff0c;至少还能弹出一个小黑框&#xff0c;给我个hello world。 ✨ 如何你和我一样…

【python报错】‘XXX‘ object is not callable

‘XXX‘ object is not callable----这个报错通常是因为在代码中某一个变量的名字和函数的名字重复导致的&#xff0c;此时需要确定名称使用是否正确&#xff0c;如果重复则需要修改其中一个名字&#xff1b;如果名字没有问题&#xff0c;那就要看表达式写的对不对&#xff0c;…

使用 Lombok 遇到一个问题

起因是换了一个电脑&#xff0c;重新从服务器上拉了一个项目。项目是由maven构建的&#xff0c;在控制台中使用mvn命令编译项目时&#xff0c;没有任何问题&#xff0c;编译成功。如下图&#xff1a; 可是idea里面的源码&#xff0c;却标红了&#xff0c;如下&#xff1a; 错误…