野牛程序员讲少儿编程——快速排序(C++ 版)
🦬小朋友们,今天跟野牛程序员来聊聊一个超级厉害的排序算法—— 快速排序 !它快得就像赛车一样,能在短时间内把一堆乱七八糟的数字排好序!🚀
🎯 什么是快速排序?
快速排序,简称 快排(Quicksort),是一种 “分而治之” 的排序方法。它的思路就像整理玩具一样:
选一个基准值(pivot),比如拿起一个玩具🎁 说:“好,大家跟它比比大小!”
比它小的放左边,比它大的放右边,这样,玩具堆就分成了两部分。
左右两边再各自继续排序,直到所有玩具都排好为止!
这个过程就像分组比赛一样,把问题一拆二,二拆四,最后轻松解决!💡
👀 快速排序是怎么工作的?
来看看野牛程序员举的一个例子,假设有这样一组数字:
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 还没排序
但是,12
和 25
只剩两个数了,它们已经是正确的顺序了:
[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²),但优化后可以避免!
🎉 野牛程序员:小朋友们学到了什么?
快速排序是一种“分而治之”的排序方法
选一个基准值,把小的放左边,大的放右边
递归地对左右两部分排序
它非常快,适用于大规模数据排序!
小朋友们,快去试试 用 C++ 代码自己实现快速排序吧! 🚀🚀🚀
