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

文章目录


希尔排序

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

第一趟排序: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

c 复制代码
#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

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

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(log~2~n) 或者O(log~3~n) ,即O(log n)

内层循环:

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

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

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

相关推荐
古希腊掌管学习的神14 分钟前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca15 分钟前
洛谷 P1706 全排列问题 C语言
算法
浊酒南街21 分钟前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程28 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
学术头条33 分钟前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien1 小时前
图像处理-Ch4-频率域处理
算法
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234561 小时前
活着就好20241224
学习·算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法