快速排序_C语言

发布时间 2023-04-24 11:13:43作者: Kael'thas

思路:

base: 取最低位为base
j: 从右向左找到比base小的数,放到第i位。i++
i: 从左向右找到比base大的数,放到第j位。j--
当i==j时,base放到第i位,此时base左面都是小于base的,base右边都是大于base的

递归:只要最低位小于最高位,执行递归

代码

#include <stdio.h>

//作用:打印数组元素
void display(int array[], int maxlen) {
    for (int i = 0; i < maxlen; i++) {
        printf("%-3d", array[i]);
    }
    printf("\n");
}

//作用:快速排序
void QuickSort(int *arr, int low, int high) {

    //if语句如果low>=high,就不会再次递归
    if (low < high) {
        int i, j, base;
        i = low;
        j = high;
        base = arr[low];

        while (i < j) {
            //从右往左找到大于base的数
            while (i < j && arr[j] >= base) {
                j--;
            }
            if (i < j) {
                arr[i++] = arr[j];
            }
            //从左往右找到小于base的数
            while (i < j && arr[i] <= base) {//?
                i++;
            }
            if (i < j) {
                arr[j--] = arr[i];
            }
        }
        arr[j] = base;

        // 递归调用
        QuickSort(arr, low, j - 1);     // 排序k左边
        QuickSort(arr, j + 1, high);    // 排序k右边
    }
}

// 主函数
int main() {
    int array[] = {17, 34, 25, 17, 16};
    int maxlen = sizeof(array) / sizeof(array[0]);

    printf("before sort\n");
    display(array, maxlen);

    QuickSort(array, 0, maxlen - 1);  // 快速排序

    printf("after sort\n");
    display(array, maxlen);

    return 0;
}