目录
题目
解法一:快速排序
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);
}