上篇:《排序算法的奇妙世界:如何让数据井然有序?》

个人主页:strive-debug

排序算法精讲:从理论到实践

一、排序概念及应用

1.1 基本概念

**排序**:将一组记录按照特定关键字(如数值大小)进行递增或递减排列的操作。

1.2 常见排序算法分类

  • **简单低效型**:直接插入排序、冒泡排序、选择排序

  • **高效优化型**:希尔排序、快速排序、归并排序、堆排序


二、基础排序算法实现

2.1 插入排序家族

2.1.1 直接插入排序

核心思想:将待排元素逐个插入已有序序列中。

复制代码
void InsertSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
			if (arr[end] > tmp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end+1] = tmp;
	}
}

我的理解(如图所示):

**特性分析**:

**接近有序时效率高**

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

空间复杂度:O(1)

2.1.2 希尔排序(优化版插入排序)

**优化策略**:通过分组增量(gap)预排序逐步逼近全局有序。

复制代码
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//推荐写法:除3
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if(arr[end] > tmp)
				{ 
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}

我的理解(如图所示):

**特性分析**:

**突破O(N^2)的时间瓶颈**

时间复杂度:约 O(N^{1.3})

空间复杂度:O(1)


2.2 选择排序

直接选择排序

**核心思想**:每轮选取最小/最大值固定到序列两端。

复制代码
void SelectSort(int* arr, int n)
{
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int maxi = begin;
		int mini = begin;
		for (int i = begin; i <= end; i++)//end=n-1,不是n
		{
			if (arr[i] > arr[maxi])
			{
				maxi = i;//不是arr[i]
			}
			if (arr[i] < arr[mini])
			{
				mini = i;
			}
		}
		//要先判断如果maxi在开头的话,就是发生来回替换的情况
		if (maxi == begin)
		{
			maxi = mini;
		}
		//循序不能乱
		Swap(&arr[mini], &arr[begin]);
		Swap(&arr[maxi], &arr[end]);
		//不要忘记让end和begin,这是一个while循环
		end--;
		begin++;
	}
}

我的理解(如图所示):


2.3 交换排序

冒泡排序

经典实现+提前终止优化:

复制代码
void BubbleSort(int* arr, int n)
{
	int exchange = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				exchange = 1;
				Swap(&arr[j], &arr[j + 1]);
			}
		}
		if (exchange == 0)
		{
			break;
		}
	}
}

**适用场景**:

**教学演示为主,实际工程较少使用**

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


三、算法对比总结

| 算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |

|--------------|------------------|------------|--------|------------------------|

| 直接插入排序 |O(N^2) | O(1) | ✔️ | 小规模或接近有序数据 |

| 希尔排序 |O(N^{1.3}) |O(1) | ✖️ | 中等规模数据 |

| 选择排序 |O(N^2) | O(1) | ✖️ | 教学演示 |

| 冒泡排序 |O(N^2) | O(1) | ✔️ | 理解交换思想 |


**四、下篇预告**

**《高阶排序算法:分治思想与性能突破》**

  • **快速排序的三种分区策略**

  • **归并排序的递归与非递归实现**

  • **堆排序与优先队列的深度关联**


相关推荐
2501_924879361 小时前
口罩识别场景误报率↓79%:陌讯多模态融合算法实战解析
人工智能·深度学习·算法·目标检测·智慧城市
Christo32 小时前
TFS-2022《A Novel Data-Driven Approach to Autonomous Fuzzy Clustering》
人工智能·算法·机器学习·支持向量机·tfs
木木子99992 小时前
超平面(Hyperplane)是什么?
算法·机器学习·支持向量机·超平面·hyperplane
星空下的曙光3 小时前
React 虚拟 DOM Diff 算法详解,Vue、Snabbdom 与 React 算法对比
vue.js·算法·react.js
♞沉寂4 小时前
数据结构——双向链表
数据结构·算法·链表
大阳1234 小时前
数据结构2.(双向链表,循环链表及内核链表)
c语言·开发语言·数据结构·学习·算法·链表·嵌入式
掘根4 小时前
【Redis】string字符串
数据结构·数据库·redis
CUC-MenG4 小时前
2025牛客多校第六场 D.漂亮矩阵 K.最大gcd C.栈 L.最小括号串 个人题解
c语言·c++·算法·矩阵
2401_876221345 小时前
Tasks and Deadlines(Sorting and Searching)
c++·算法
jie*5 小时前
小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
数据结构·windows·python