归并排序(c语言递归实现)

#include

#include

#include

void Merge(int *a, int *tmp, int lpos, int rpos, int rightend) {

    int original_lpos = lpos; // 保存原始左起始位置

    int leftend = rpos - 1;

    int tmppos = original_lpos;

    while (lpos <= leftend && rpos <= rightend) {

        if (a[lpos] <= a[rpos]) {

            tmp[tmppos++] = a[lpos++];

        } else {

            tmp[tmppos++] = a[rpos++];

        }

    }

    while (lpos <= leftend) {

        tmp[tmppos++] = a[lpos++];

    }

    while (rpos <= rightend) {

        tmp[tmppos++] = a[rpos++];

    }

    // 将合并后的数据复制回原数组

    for (int i = original_lpos; i <= rightend; i++) {

        a[i] = tmp[i];

    }

}

void MSort(int *a, int *tmp, int left, int right) {

    if (left == right) return;

    int mid = (left + right) / 2;

    MSort(a, tmp, left, mid);

    MSort(a, tmp, mid + 1, right);

    Merge(a, tmp, left, mid + 1, right);

}

int main() {

    int n;

    scanf("%d", &n);

    int *a = (int *)malloc(n * sizeof(int));

    for (int i = 0; i < n; i++) {

        scanf("%d", &a[i]);

    }

    int *tmp = (int *)malloc(n * sizeof(int));

    MSort(a, tmp, 0, n - 1);

    for (int i = 0; i < n; i++) {

        printf("%d ", a[i]); // 输出原数组a

    }

    free(a);

    free(tmp);

    system("pause");

    return 0;

}

//说实话,刚开始一直不理解究竟怎么把原数组进行所谓的分割这一过程,看代码递归也想了好一会,于2025年3月11日晚22点初窥天门,所谓的分割,就是通过不断递归使得递归函数的参数不断变化,例如上述代码待分数组的左下标与右下标,待递归深度最大时,开始不断归并,再联系此时参数便能不断操作相应下标范围内的数组,那这不就已经分出来数组并开始归并了吗。

你可能感兴趣的:(c语言,开发语言)