当前位置:首页C++ > 正文

野牛程序员讲少儿编程——快速排序(C++ 版)

作者:野牛程序员:2025-03-17 11:29:18C++阅读 2060
野牛程序员讲少儿编程——快速排序(C++ 版)

🦬小朋友们,今天跟野牛程序员来聊聊一个超级厉害的排序算法—— 快速排序 !它快得就像赛车一样,能在短时间内把一堆乱七八糟的数字排好序!🚀


🎯 什么是快速排序?

快速排序,简称 快排(Quicksort),是一种 “分而治之” 的排序方法。它的思路就像整理玩具一样:

  1. 选一个基准值(pivot),比如拿起一个玩具🎁 说:“好,大家跟它比比大小!”

  2. 比它小的放左边,比它大的放右边,这样,玩具堆就分成了两部分。

  3. 左右两边再各自继续排序,直到所有玩具都排好为止!

这个过程就像分组比赛一样,把问题一拆二,二拆四,最后轻松解决!💡


👀 快速排序是怎么工作的?

来看看野牛程序员举的一个例子,假设有这样一组数字:

64, 25, 12, 22, 11

要把它排成从小到大的顺序,快排会这么做:

第 1 步:选择基准值(Pivot)

野牛程序员随便选一个基准值,最常见的做法是选最后一个数作为基准值。
这里选 11 作为 pivot(基准值):

64, 25, 12, 22, [11]

现在,所有比 11 小的放左边,比 11 大的放右边

[11], 25, 12, 22, 64

第一个小朋友 “11” 已经站在了正确的位置 🎉,它再也不会动了!


第 2 步:继续对右边的数字排序

剩下的数字 25, 12, 22, 64 还没排好,野牛程序员再挑一个基准值,这次选 最后一个数 64

[11], 25, 12, 22, [64]

所有比 64 小的放左边,比 64 大的放右边(但是没比它大的了)

[11], 25, 12, 22, [64] ✅

哇,64 也站对了位置! 🎉🎉


第 3 步:继续对中间的数字排序

现在,剩下的 25, 12, 22 还没排好,野牛程序员再来一次!
选最后一个数 22 作为 pivot

[11], 25, 12, [22], 64

小于 22 的放左边,大于 22 的放右边:

[11], 12, [22], 25, 64

太棒了,22 也站对了位置! 🎉🎉🎉


第 4 步:剩下的 12 和 25 还没排序

但是,1225 只剩两个数了,它们已经是正确的顺序了:

[11], [12], [22], [25], [64]

完美!所有数字都站对了队伍,排序完成!✅


🔥 C++ 代码实现

快排的代码其实并不难!来看看 C++ 版本的实现吧:

#include <iostream>
using namespace std;

// 分区函数:把小的放左边,大的放右边
int partition(int arr[], int low, int high) {
    int pivot = arr[high];  // 选最后一个数作为基准值
    int i = low - 1;        // i 负责记录比 pivot 小的位置

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {  // 如果当前数比 pivot 小
            i++;               // i 向前走一步
            swap(arr[i], arr[j]);  // 交换
        }
    }
    swap(arr[i + 1], arr[high]);  // 把 pivot 放到正确位置
    return i + 1;  // 返回 pivot 的最终位置
}

// 递归实现快速排序
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high); // 找到基准值的位置
        quickSort(arr, low, pi - 1);  // 递归排序左边
        quickSort(arr, pi + 1, high); // 递归排序右边
    }
}

// 主函数
int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);

    cout << "原始数组: ";
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;

    quickSort(arr, 0, n - 1);

    cout << "排序后: ";
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;

    return 0;
}

🧐 为什么快排这么快?

快排利用 分而治之 的思想,每次把问题分成两半,快速缩小问题的规模。

  • 最优情况:每次刚好平分,时间复杂度 O(n log n),非常快!🚀

  • 最坏情况:如果每次选的 pivot 都是最大或最小,快排可能会退化成 O(n²),但优化后可以避免!


🎉 野牛程序员:小朋友们学到了什么?

  1. 快速排序是一种“分而治之”的排序方法

  2. 选一个基准值,把小的放左边,大的放右边

  3. 递归地对左右两部分排序

  4. 它非常快,适用于大规模数据排序!

小朋友们,快去试试 用 C++ 代码自己实现快速排序吧! 🚀🚀🚀


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 野牛程序员讲少儿编程——快速排序(C++ 版)
  • 相关推荐

    最新推荐

    热门点击