【初探数据结构】详解三大经典排序算法(选择/堆/冒泡)

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感兴趣的朋友!


引言

排序算法是数据结构的核心基础。本文通过选择排序、堆排序、冒泡排序的对比解析,帮助初学者掌握算法思想与实现细节。文末附算法对比总结表。


一、选择排序(Selection Sort)

1.1 核心思想

“选最小的,放左边” “选最大的,放右边”
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

这里我们在序列两头同时进行选择排序,可以一定程度上提高选择排序的性能。

1.2 动态示意图

在这里插入图片描述
[示例数组:7, 3, 5, 1]

  • 第1轮:找到最小值1 ↔ 与7交换 → [1, 3, 5, 7]
  • 第2轮:在剩余部分找最小3(已在正确位置)
  • 第3轮:找最小5 ↔ 无需交换
  • 排序完成

1.3 代码实现

void SelectSort(int* a, int n)
{
	//定义左右指针
	int left = 0;
	int right = n - 1;
	//当左右指针相遇,排序完成
	while (left < right)
	{
		int max = left, min = left;
		//遍历选出最大最小数
		for (int i = left+1; i <= right; i++) {
			if (a[max] > a[i]) {
				max = i;
			}
			if (a[min] < a[i]) {
				min = i;
			}
		}
		swap(&a[left], &a[min]);
		if (left == max)
			max = min;
		swap(&a[right], &a[max]);
		left++;
		right--;
	}
}

1.4 关键特性

  • 时间复杂度:O(n²)(双重循环)
  • 空间复杂度:O(1)(原地排序)
  • 不稳定性:交换可能破坏相等元素顺序(如 [5, 5, 2]

二、堆排序(Heap Sort)

堆排序在学习堆的时候学习过哦(´▽ʃ♡ƪ)
欢迎学习
🚀传送门【初探数据结构】堆的应用实例(堆排序与TopK问题)

三、冒泡排序(Bubble Sort)

相信大家堆冒泡已经耳熟能详了吧,那么你是否能手撕呢?这也是检验你C语言代码功底的试金石哦😉

3.1 核心思想

“相邻比武,大的沉底”
通过相邻元素比较交换,使较大元素逐渐移动到末尾。

3.2 优化技巧

  • 提前终止:若某轮未发生交换,说明已有序
  • 记录最后交换位置:减少后续比较范围

3.3 动态示例

在这里插入图片描述

初始数组:[6, 3, 8, 2]

  • 第1轮:3↔6, 6↔8 → [3, 6, 2, 8]
  • 第2轮:2↔6 → [3, 2, 6, 8]
  • 第3轮:2↔3 → [2, 3, 6, 8]

3.4 代码实现(带优化)

// 冒泡排序
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		bool exchange = false;
		for (int i = 0; i < n - 1 - j; i++)
		{
			if (a[i] > a[i + 1]) {
				swap(&a[i], &a[i + 1]);
				exchange = true;
			}
		}
		if (exchange == false) {
			break;
		}
	}
}

3.5 关键特性

  • 时间复杂度:最佳O(n)(已排序),最差O(n²)
  • 稳定性:稳定(相等元素不交换)
  • 教学意义:直观体现排序过程,适合入门教学

3.6 扩展学习

🚀传送门高阶C语言|库函数qsort的使用以及用冒泡排序实现qsort的功能详解


四、对比总结表

特性选择排序堆排序冒泡排序
时间复杂度O(n²)O(n log n)O(n²)
空间复杂度O(1)O(1)O(1)
稳定性不稳定不稳定稳定
适用场景小数据集大数据集教学演示
优点简单易实现高效的大数据排序稳定且直观
缺点效率低实现较复杂效率最低

希望这篇文章对你有帮助~🌹🌹🌹

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值