论冒泡和快排

快速排序和冒泡排序

一、快速排序(Quick Sort)

原理
  1. 核心思想:像"分蛋糕"一样不断拆解问题。

  2. 步骤

    • 选一个基准值(比如第一个数)

    • 把比基准值小的扔左边,大的扔右边

    • 对左边和右边重复这个操作,直到所有数排好

举个栗子 🌰

假设要排序的数组是 [5,3,8,6,4]

  1. 第1轮 :选第一个数 5 当基准

    • 左边找比5大的,右边找比5小的,交换位置:[5,3,4,6,8]

    • 最终基准归位:[3,4,5,6,8]

  2. 递归处理 左边 [3,4] 和右边 [6,8](继续选基准拆分)

大白话解释

就像整理书架,先随便挑一本书当"分界线",把比它薄的书放左边,厚的放右边。然后左右两堆书各自再按同样方法整理,直到所有书排好顺序。

cs 复制代码
#include <stdio.h>

// 交换两个元素的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 快速排序的核心分区操作
int partition(int arr[], int low, int high) {
    int pivot = arr[(low + high) / 2]; // 选择中间元素作为基准值
    int i = low - 1;                    // 左指针
    int j = high + 1;                   // 右指针

    while (1) {
        do { i++; } while (arr[i] < pivot); // 找到左边比基准大的元素
        do { j--; } while (arr[j] > pivot); // 找到右边比基准小的元素

        if (i >= j) return j; // 当指针相遇时返回分割点

        swap(&arr[i], &arr[j]); // 交换左右不符合条件的元素
    }
}

// 递归实现快速排序
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high); // 获取分割点
        quickSort(arr, low, pi);            // 排序左半部分
        quickSort(arr, pi + 1, high);       // 排序右半部分
    }
}

// 测试代码
int main() {
    int arr[] = {5, 3, 8, 6, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    quickSort(arr, 0, n - 1);

    printf("快速排序结果:");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]); // 输出:3 4 5 6 8
    return 0;
}

二、冒泡排序(Bubble Sort)

原理
  1. 核心思想:像"煮开水冒泡"一样把最大的数推到末尾。

  2. 步骤

    • 从头开始比较相邻两个数,如果前大后小就交换

    • 每轮结束后,最大的数会"沉"到最后

    • 重复直到所有数排好

举个栗子 🌰

同样排序 [5,3,8,6,4]

  1. 第1轮

    • 5和3比 → 交换 → [3,5,8,6,4]

    • 5和8比 → 不换

    • 8和6比 → 交换 → [3,5,6,8,4]

    • 8和4比 → 交换 → [3,5,6,4,8]

  2. 第2轮 :处理前4个数 [3,5,6,4],最后得到 [3,5,4,6,8]

  3. 重复直到完全有序(共需4轮)

大白话解释

就像一群人按身高排队,从左到右两两比较,高的往后站。每一轮结束,最高的人就站到了最后。下一轮不用管最后的人,继续从头开始比,直到所有人排好。

cs 复制代码
#include <stdio.h>

// 冒泡排序实现
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {       // 外层循环控制轮次
        for (int j = 0; j < n-i-1; j++) { // 内层循环进行比较交换
            if (arr[j] > arr[j+1]) {      // 如果前大后小
                // 交换相邻元素
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

// 测试代码
int main() {
    int arr[] = {5, 3, 8, 6, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    bubbleSort(arr, n);

    printf("冒泡排序结果:");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]); // 输出:3 4 5 6 8
    return 0;
}

三、对比总结

对比项 快速排序 冒泡排序
速度 快(平均时间复杂度 O(n log n)) 慢(平均时间复杂度 O(n²))
适用场景 大数据量 教学演示、小数据量
核心操作 拆分成子问题(分治思想) 相邻元素两两交换
比喻 分蛋糕 → 切块处理 煮开水 → 气泡上浮
人话版总结
  • 如果你有1000本书要整理:用快速排序(先分堆再整理)。

  • 如果你只有5本书要整理:用冒泡排序(一本本对比换位置)。

  • 快速排序像"聪明人拆解问题",冒泡排序像"老实人一步步来"。

相关推荐
天天扭码18 分钟前
一分钟解决一道算法题——矩阵置零
前端·算法·面试
天天扭码1 小时前
偶遇天才算法题 | 拼劲全力,无法战胜 😓
前端·算法·面试
2401_878624791 小时前
opencv(双线性插值原理)
人工智能·算法·计算机视觉
小豪GO!1 小时前
数据结构-八大排序
数据结构·算法·排序算法
烟锁池塘柳01 小时前
【数学建模】随机森林算法详解:原理、优缺点及应用
算法·随机森林·数学建模
大龄门外汉1 小时前
数据结构之二叉树
c语言·数据结构·笔记·改行学it
极昆仑智慧2 小时前
多模态知识图谱:重构大模型RAG效能新边界
人工智能·算法·语言模型·自然语言处理·知识图谱
天天扭码2 小时前
面试官:算法题”除自身以外数组的乘积“ 我:😄 面试官:不能用除法 我:😓
前端·算法·面试
龙萌酱2 小时前
力扣每日打卡17 49. 字母异位词分组 (中等)
前端·javascript·算法·leetcode
好易学数据结构3 小时前
可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)
数据结构·算法·leetcode·面试·二叉树·力扣·笔试·遍历·二叉树遍历·牛客网·层序遍历·z·z字形遍历·锯齿形遍历