数据结构: 排序(一)

一.各类排序

二.常见的排序

三.排序的代码实现

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) 。

相关推荐
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦15 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾16 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82116 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q16 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒16 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记16 天前
单项不带头不循环链表
数据结构·链表