- 吐吐很快乐
通过【快速排序】学习分治算法~幼儿园五岁半版本
- 2025-7-25 15:08:22 @
快速排序代码详解(幼儿园版) 快速排序就像玩"糖果分拣"游戏:
选一个糖果当裁判(pivot)
比裁判小的糖果放左边,比裁判大的放右边
对左右两边重复这个游戏
#include <stdio.h> // 导入打印糖果的工具箱
// 交换两个糖果的位置(像交换玩具)
void swap(int* a, int* b) {
int temp = *a; // 临时小盒子存放第一个糖果
*a = *b; // 把第二个糖果放到第一个位置
*b = temp; // 把临时盒子里的糖果放到第二个位置
}
// 分区函数(核心游戏规则)
int partition(int arr[], int low, int high) {
/* 参数说明:
arr:糖果盒子
low:当前游戏区域的起点
high:当前游戏区域的终点
*/
int pivot = arr[high]; // 选最右边的糖果当裁判(蓝色糖果)
int i = (low - 1); // 小糖果区的边界指针(从起点左边开始)
// 开始分拣糖果(从左到右检查每个糖果)
for (int j = low; j <= high - 1; j++) {
// 如果当前糖果比裁判小(红色糖果)
if (arr[j] < pivot) {
i++; // 小糖果区扩大一格
swap(&arr[i], &arr[j]); // 把这个小糖果放到小糖果区
}
// 比裁判大的糖果会自动留在大糖果区(绿色糖果)
}
// 游戏结束:把裁判放到正确位置(小糖果区和大糖果区中间)
swap(&arr[i + 1], &arr[high]); // 交换裁判和第一个大糖果
return (i + 1); // 返回裁判的最终位置
}
// 快速排序主函数(糖果分拣游戏)
void quickSort(int arr[], int low, int high) {
if (low < high) { // 只要还有多个糖果就继续玩
// 1. 分区(玩一次分拣游戏)
int pi = partition(arr, low, high); // pi是裁判的位置
// 2. 左边糖果区继续玩
quickSort(arr, low, pi - 1); // 裁判左边的小糖果们
// 3. 右边糖果区继续玩
quickSort(arr, pi + 1, high); // 裁判右边的大糖果们
}
// 如果只剩一个糖果(low==high),就不需要排序啦!
}
// 测试糖果排序
int main() {
// 准备7个不同大小的糖果
int arr[] = {10, 80, 30, 90, 40, 50, 70};
int n = sizeof(arr) / sizeof(arr[0]); // 计算糖果总数
// 展示原始糖果
printf("排序前: ");
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
// 开始玩糖果分拣游戏(从0号到6号糖果)
quickSort(arr, 0, n - 1);
// 展示排好序的糖果
printf("\n排序后: ");
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
return 0; // 游戏结束
}
运行结果(糖果排排队)
排序前: 10 80 30 90 40 50 70 排序后: 10 30 40 50 70 80 90 游戏过程图解(用糖果演示) 假设糖果 [10, 80, 30, 90, 40, 50, 70]:
选最右边的70当裁判(蓝色糖果)
分拣过程:
10<70 → 放到小糖果区(位置0)
80>70 → 留在大糖果区
30<70 → 放到小糖果区(位置1)
90>70 → 留在大糖果区
40<70 → 放到小糖果区(位置2)
50<70 → 放到小糖果区(位置3)
交换裁判:把70和第一个大糖果80交换 → [10,30,40,50,70,90,80]
现在裁判70在位置4,左边是[10,30,40,50],右边是[90,80]
对左边和右边重复游戏,直到所有糖果排好序
就像把糖果不断分成小堆,每次选一个裁判让小的在左、大的在右,最后所有糖果就自动排好队啦!
1 条评论
-
董章正 上课满场飞 LV 6 @ 2025-7-25 15:24:40
听说被法海诅咒的题不会AC,只会FE
- 1