【力扣 中等 C】912. 排序数组

目录

题目

解法一:快速排序

解法二:归并排序


题目

解法一:快速排序

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void partition(int* nums, int left, int right, 
    int* leftMax, int* rightMin)
{
    int randomNum = nums[left + rand() % (right - left + 1)];

    int l = left, r = right, i = left;
    while (i <= r)
    {
        if (nums[i] < randomNum)
            swap(&nums[l++], &nums[i++]);
        else if (nums[i] > randomNum)
            swap(&nums[r--], &nums[i]);
        else
            i++;
    }
    *leftMax = l;
    *rightMin = r;
}

void quickSort(int* nums, int left, int right)
{
    if (left >= right)
        return;

    int leftMax, rightMin;
    partition(nums, left, right, &leftMax, &rightMin);
    quickSort(nums, left, leftMax - 1);
    quickSort(nums, rightMin + 1, right);

}

int* sort(int* nums, int len)
{
    quickSort(nums, 0, len - 1);
    return nums;
}

int* sortArray(int* nums, int numsSize, int* returnSize)
{
    *returnSize = numsSize;
    srand(time(NULL));
    return sort(nums, numsSize);
}

解法二:归并排序

void merge(int* nums, int* helpArr, int left, int mid, int right)
{
    int helpArrIndex = left;
    int part1Index = left;
    int part2Index = mid + 1;
    
    while (part1Index <= mid && part2Index <= right)
        helpArr[helpArrIndex++] = nums[part1Index] <= nums[part2Index] ?
            nums[part1Index++] : nums[part2Index++];
    while (part1Index <= mid)
        helpArr[helpArrIndex++] = nums[part1Index++];
    while (part2Index <= right)
        helpArr[helpArrIndex++] = nums[part2Index++];
    memcpy(nums + left, helpArr + left, sizeof(*nums) * (right - left + 1));
}
 
void mergeSort(int* nums, int* helpArr, int left, int right)
{
    if (left == right)
        return;
    
    int mid = (left + right) / 2;
    mergeSort(nums, helpArr, left, mid);
    mergeSort(nums, helpArr, mid + 1, right);
    merge(nums, helpArr, left, mid, right);
}
 
int* sort(int* nums, int len)
{
    int* helpArr = malloc(sizeof(*helpArr) * len);
    mergeSort(nums, helpArr, 0, len - 1);
    free(helpArr);
    return nums;
}
 
int* sortArray(int* nums, int numsSize, int* returnSize)
{
    *returnSize = numsSize;
    return sort(nums, numsSize);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值