排序算法是数据结构的核心基础。本文通过选择排序、堆排序、冒泡排序的对比解析,帮助初学者掌握算法思想与实现细节。文末附算法对比总结表。
“选最小的,放左边” 或 “选最大的,放右边” 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
这里我们在序列两头同时进行选择排序,可以一定程度上提高选择排序的性能。
[示例数组:7, 3, 5, 1]
[1, 3, 5, 7]
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--;
}
}
[5, 5, 2]
)堆排序在学习堆的时候学习过哦(´▽ʃ♡ƪ)
欢迎学习
🚀传送门:【初探数据结构】堆的应用实例(堆排序与TopK问题)
相信大家堆冒泡已经耳熟能详了吧,那么你是否能手撕呢?这也是检验你C语言代码功底的试金石哦😉
“相邻比武,大的沉底” 通过相邻元素比较交换,使较大元素逐渐移动到末尾。
初始数组:[6, 3, 8, 2]
[3, 6, 2, 8]
[3, 2, 6, 8]
[2, 3, 6, 8]
// 冒泡排序
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;
}
}
}
🚀传送门:高阶C语言|库函数qsort的使用以及用冒泡排序实现qsort的功能详解
特性 | 选择排序 | 堆排序 | 冒泡排序 |
---|---|---|---|
时间复杂度 | O(n²) | O(n log n) | O(n²) |
空间复杂度 | O(1) | O(1) | O(1) |
稳定性 | 不稳定 | 不稳定 | 稳定 |
适用场景 | 小数据集 | 大数据集 | 教学演示 |
优点 | 简单易实现 | 高效的大数据排序 | 稳定且直观 |
缺点 | 效率低 | 实现较复杂 | 效率最低 |