数据结构: 排序(一)

一.各类排序

二.常见的排序

三.排序的代码实现

1.插入排序

(1)直接插入排序

直接插⼊排序的特性总结

1.元素集合越接近有序,直接插⼊排序算法的时间效率越⾼

2.时间复杂度:O(N^2)

3.空间复杂度:O(1)

代码如下:

(2)希尔排序:

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

希尔排序的特性总结:

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

2. 当 gap > 1 时都是预排序,⽬的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序 的了,这样就会很快。这样整体⽽⾔,可以达到优化的效果。

代码如下:

(2.1)希尔排序的时间复杂度计算:

希尔排序的时间复杂度估算: 外层循环: 外层循环的时间复杂度可以直接给出为:O(log2 n) 或者O(log3 n) ,即O(log n) 内层循环:

证明结果如下:

假设⼀共有n个数据,合计gap组,则每组为n/gap个;

在每组中,插⼊移动的次数最坏的情况下为 (1 + 2 + 3 + (n/gap-1))⼀共是gap组,因此:

总计最坏情况下移动总数为:gap ∗ 1 + 2 + 3 + .... + ( n/gap-1)

gap取值有(以除3为例):n/3 n/9 n/27 ...... 2 1

• 当gap为n/3时,移动总数为:3* n (1 + 2) = n

• 当gap为n/9时,移动总数为:9* n (1 + 2 + 3 + .... + 8) = n/9*(2(1 + 8))/2= 4n

• 最后⼀躺,gap=1即直接插⼊排序,内层循环排序消耗为n

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

因此,希尔排序在最初和最后的排序的次数都为n,即前⼀阶段排序次数是逐渐上升的状态,当到达 某⼀顶点时,排序次数逐渐下降⾄n,⽽该顶点的计算暂时⽆法给出具体的计算过程,希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。

《数据结构(C语⾔版)》---严蔚敏书中给出的时间复杂度为:

(3)直接选择排序:

cpp 复制代码
void SelectSort(int* a, int n)
{
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int mini = begin, maxi = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}
		if (begin == maxi)
		{
			maxi = mini;
		}
		swap(&a[mini], &a[begin]);
		swap(&a[maxi], &a[end]);

		++begin;
		--end;
	}
}
直接选择排序的特性总结:
  1. 直接选择排序思考⾮常好理解,但是效率不是很好。实际中很少使⽤。

  2. 时间复杂度:O(N )。

  3. 空间复杂度:O(1) 。

相关推荐
闪电悠米9 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记10 小时前
堆(数据结构)
数据结构·
wabs66614 小时前
关于图论【卡码网100.最大岛屿的面积的思考】
数据结构·算法·图论
yuannl1015 小时前
图的最短路径Dijkstra
数据结构
zander25817 小时前
138. 随机链表的复制
数据结构·算法·链表
过期动态17 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面17 小时前
栈在递归中的应用
数据结构·算法
皓月斯语17 小时前
程序设计语言的特点
开发语言·数据结构·c++
邪修king18 小时前
C++ 进阶终章:异常机制与智能指针全解 —— 从错误处理到 RAII 资源管理,打通现代 C++ 的核心命脉
android·数据结构·c++
Adios7941 天前
设置交集大小至少为2
数据结构·算法·leetcode