递归实现快速排序

68 阅读1分钟
#include <stdio.h>
#include <stdlib.h>

void swap(int *nums, int i, int j)
{
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
    return;
}

int *Partition(int *nums, int left, int right)
{
    // 扩充边界,把小于选中的数放左边,大于的放右边
    int less = left - 1;   // 小于区有边界
    int more = right;      // 大于区左边界
    while (left < more) {
        if (nums[left] < nums[right]) {
            swap(nums, ++less, left++);
        } else if (nums[left] > nums[right]) {
            swap(nums, --more, left);
        } else if (nums[left] == nums[right]) {
            left++;
        }
    }
    swap(nums, more, right);
    int *p = (int*)malloc(sizeof(int) * 1);
    *p = less + 1;
    *(p + 1) = more;
    return p;
}

void QuickSort(int *nums, int left, int right)
{
    if (left < right) {
        int randNum = rand() % (right - left + 1);    // 生成0-(right-left)的随机数
        printf("%d\n", randNum);
        // 交换随机选取的数和最后一个位置的数
        swap(nums, left + randNum, right);

        int *p = (int*)malloc(sizeof(int) * 2);
        p = Partition(nums, left, right);      // p中保存的是两个边界
        QuickSort(nums, left, p[0] - 1);
        QuickSort(nums, p[1] + 1, right);
    }
}

int main()
{
    int nums[10] = {12, 34, 15, 2, 5, 14, 16, 10, 9, 1};
    printf("Before sort: ");
    for (int i = 0; i < 10; i++) {
        printf(" %d", nums[i]);
    }
    printf("\n");

    QuickSort(nums, 0, 9);

    printf("After  sort: ");
    for (int i = 0; i < 10; i++) {
        printf(" %d", nums[i]);
    }
    printf("\n");  
    return 0;
}