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

目录

题目

解法一:快速排序

解法二:归并排序


题目

【力扣 中等 C】912. 排序数组_第1张图片

解法一:快速排序

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);
}

你可能感兴趣的:(c语言,leetcode,数据结构,算法,开发语言)