基本思路
递归的思路是递归地把当前序列平均分割成两半,然后在保持元素顺序的同时将上一步得到的子序列合并到一起
实现
#include <stdio.h>
void Merge(int *nums, int left, int mid, int right)
{
int help[right-left+1];
int p1 = left;
int p2 = mid + 1;
int i = 0;
while (p1 <= mid && p2 <= right) {
help[i++] = nums[p1] <= nums[p2] ? nums[p1++] : nums[p2++];
}
while (p1 <= mid) {
help[i++] = nums[p1++];
}
while (p2 <= right) {
help[i++] = nums[p2++];
}
for (i = 0; i < right - left + 1; i++) {
nums[left+i] = help[i];
}
}
void Process(int *nums, int left, int right)
{
if (left == right) {
return;
}
int mid = left + ((right - left) >> 1);
Process(nums, left, mid);
Process(nums, mid + 1, right);
Merge(nums, left, mid, right);
}
void MergeSort(int *nums, int len)
{
if (nums == NULL || len <= 1) {
return;
}
Process(nums, 0, len - 1);
return;
}
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");
MergeSort(nums, 10);
printf("After sort: ");
for (int i = 0; i < 10; i++) {
printf(" %d", nums[i]);
}
printf("\n");
return 0;
}