编辑代码

#include <stdio.h>

// 返回基准值在数组中的位置
int findPivotPos(int arr[], int arrStart, int arrEnd) {
    return arrStart;
}

// 根据基准值进行分区,把比基准值大的元素放右边,小的元素放左边
// 返回值:基准值在排序后的位置
int partition(int arr[], int arrStart, int arrEnd, int pivotPos) {
    int pivotValue = arr[pivotPos];
    arr[pivotPos] = arr[arrEnd - 1];

    int ItPivotValueCount = 0;
    for (int i = arrStart; i < arrEnd - 1; i++) {
        if (arr[i] < pivotValue) {
            int temp = arr[arrStart + ItPivotValueCount];
            arr[arrStart + ItPivotValueCount] = arr[i];
            arr[i] = temp;
            ++ItPivotValueCount;
        }
    }
    arr[arrEnd - 1] = arr[arrStart + ItPivotValueCount];
    arr[arrStart + ItPivotValueCount] = pivotValue;

    return arrStart + ItPivotValueCount;
}

void QuickSort(int arr[], int arrStart, int arrEnd) {

    // 写出递归的终止条件
    if (arrEnd - arrStart <= 1) {
        return;
    }

    // 从数组中找一个基准值
    int pivotPos = findPivotPos(arr, arrStart, arrEnd);

    // 分区
    int pivotOrderedPos = partition(arr, arrStart, arrEnd, pivotPos);

    // 递归调用
    QuickSort(arr, arrStart, pivotOrderedPos);
    QuickSort(arr, pivotOrderedPos+1, arrEnd);

}

int main() {

    int arr[] = {3,44,38,5,47,15,36,27,2,46,4,19,50,48};
    int arrEnd = sizeof(arr)/sizeof(arr[0]);
    printf("数组arr:");
    for (int i = 0; i < arrEnd; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    QuickSort(arr, 0, arrEnd);
    printf("快速排序后:");
    for (int i = 0; i < arrEnd; ++i) {
        printf("%d ", arr[i]);
    }

    printf("\n");
    int arr1[] = {20,23,11,14,21,26,2,0};
    int arrEnd1 = sizeof(arr1)/sizeof(arr1[0]);
    printf("数组arr1:");
    for (int i = 0; i < arrEnd1; ++i) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    QuickSort(arr1,0,arrEnd1);
    printf("快速排序后:");
    for (int i = 0; i < arrEnd1; ++i) {
        printf("%d ", arr1[i]);
    }
    return 0;
}