快速排序代码详解(幼儿园版) 快速排序就像玩"糖果分拣"游戏:

选一个糖果当裁判(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 条评论

  • 1