7、C语言三大经典排序算法:冒泡、选择、插入排序

一、冒泡排序

基本思想

冒泡排序的核心思路是:

相邻元素两两比较,把较大的数往后“冒”,每一轮都会将未排序部分中的最大值放到最后。

就像水里的气泡一样,每次“冒”出一个最大值到顶部。


排序过程示意

假设数组为:


[5, 3, 4, 1]

1️、第 1 轮:


[3, 4, 1, 5] → 最大值 5 被放到最后

2️、第 2 轮:


[3, 1, 4, 5] → 次大值 4 到倒数第二个

3️、 第 3 轮:

[1, 3, 4, 5] → 全部有序


C语言实现

#include <stdio.h>

void bubble_sort(int a[], int len) {
    int i, j;
    for (j = len - 1; j > 0; j--) {  // 外层控制趟数
        for (i = 0; i < j; i++) {    // 内层控制相邻比较
            if (a[i] > a[i + 1]) {   // 前大后小则交换
                int tmp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = tmp;
            }
        }
    }
}

int main() {
    int a[] = {5, 2, 9, 1, 7};
    int len = sizeof(a) / sizeof(a[0]);
    bubble_sort(a, len);
    for (int i = 0; i < len; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

特点总结

特性冒泡排序
时间复杂度O(n²)
空间复杂度O(1)
稳定性稳定
适用场景数据量较小,逻辑入门

二、选择排序

基本思想

选择排序每一轮从 未排序部分中找到最小值,放到当前起始位置。
即:

每轮“选择”一个最小的,放到前面。


排序过程示意

[5, 3, 4, 1]

1️、 找最小值 1 → 放到第 0 位
[1, 3, 4, 5]

2️、继续在 [3, 4, 5] 中找最小值 3
[1, 3, 4, 5](已经排好)


C语言实现

void select_sort(int a[], int len) {
    int i, j;
    for (j = 0; j < len - 1; j++) {
        for (i = j + 1; i < len; i++) {
            if (a[j] > a[i]) {
                int tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
}

特点总结

特性选择排序
时间复杂度O(n²)
空间复杂度O(1)
稳定性不稳定(相同元素可能交换)
适用场景小规模数组、要求交换次数较少的情况

三、插入排序

基本思想

插入排序的思路就像打扑克牌:

把一个“新牌”插入到已经排好序的手牌中,保持顺序不变。

每次取出一个元素,插入到前面有序区间的正确位置。


排序过程示意

初始: [5, 3, 4, 1]
第1轮: [3, 5, 4, 1]
第2轮: [3, 4, 5, 1]
第3轮: [1, 3, 4, 5]

C语言实现

void insert_sort(int a[], int len) {
    for (int i = 0; i < len - 1; i++) {
        int j = i + 1;
        int k = a[j]; // 待插入元素
        while (j > 0 && a[j - 1] > k) { // 从后往前比较
            a[j] = a[j - 1]; // 整体后移
            j--;
        }
        a[j] = k; // 插入到正确位置
    }
}

特点总结

特性插入排序
时间复杂度O(n²),但在部分有序数据中更快
空间复杂度O(1)
稳定性稳定
适用场景数据量小、部分有序的数据集

四、三种排序的对比

排序算法时间复杂度空间复杂度稳定性特点
冒泡排序O(n²)O(1)稳定实现简单、效率低
选择排序O(n²)O(1)不稳定交换次数最少
插入排序O(n²)O(1)稳定局部有序时性能好

五、总结

排序类型思想简述推荐使用场景
冒泡排序两两交换,最大“冒”上来基础教学、逻辑入门
选择排序找最小放前面数据量小,交换代价高的场合
插入排序插入到有序区间数据部分有序时更高效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值