归并排序-C语言实现

708 阅读1分钟

基本思路

递归的思路是递归地把当前序列平均分割成两半,然后在保持元素顺序的同时将上一步得到的子序列合并到一起

实现

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