归并排序

归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾


//利用啦分治的思想
#include <stdio.h>
#include <stdlib.h>
void Moerage(int a[], int b[], int heard, int moiety, int end) {
    int i, j, k;
    i = heard;//代表的是传过来的数组的分成两份左边份的第一个数
    j = moiety + 1;//代表的就是右边那份的第一位
    k = heard;
    /*三个while的作用就是分别把两个数组的第一位到最后一位进行一一比较把从小到大的数字依次存入数组b[]中*/
    while (i < moiety + 1 && j < end + 1) {
        if (a[i]>a[j]) {
            b[k] = a[j];
            j++;
        }
        else {
            b[k] = a[i];
            i++;
        }
        k++;
    }
    /*这里的两个while是把i开始或j开始的数组中比较后剩余的数据全部接着存入b[]中*/
    while (i < moiety + 1) {
        b[k] = a[i]; k++, i++;
    }
    while (j < end + 1) {
        b[k] = a[j]; k++, j++;
    }
    /*将数据移入a[]数组中为下一次的递归做准备,b[]数组其实只是交换时的容器,每一次的递归数组还是以a[]数组为主来二分*/
    for (i = heard; i < end + 1; i++) {
        a[i] = b[i];
    }

}
void Interior(int a[], int b[], int heard, int end) {
    int moiety;
    if (heard < end) {
        moiety = (heard + end) / 2;//将数组分成两份
        Interior(a, b, heard, moiety);//递归调用,一直将分成两份的前一个继续分成两个
        Interior(a, b, moiety + 1, end);//递归调用,一直将分成两份的后一个继续分成两个
        Moerage(a, b, heard, moiety, end);//将分成的数组进行排序
    }
}
int main() {
    int i, n;
    int *a;
    int *b;
    printf("输入需要比较的数的个数:\n");
    scanf("%d", &n);
    a = (int *)malloc(sizeof(int) * n);
    printf("输入%d个数字:\n", n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    b = (int *)malloc(sizeof(int)*n);
    Interior(a, b, 0, n - 1);
    printf("排序后的序列:");
    for (i = 0; i < n; i++)
        if (i < n - 1)
            printf("%d,", a[i]);
        else
            printf("%d", a[i]);
    return 0;
}

结果截图
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值