归并排序

#include <iostream>
#include <stdlib.h>
using namespace std;
void Merge(int a[],int b[],int left,int i,int right)/*a和b都是递增的,将a[]中的left到i和i+1到right合并成一个新的排好序的向量装到b[]里面去*/
{
    int w=left,j=left,k=i+1;  //a和b维度一样,w是b的指针,从left开始,j是前半段的指针,k是后半段的指针
    while(j<=i&&k<=right)     //与数据结构链表的Merge类似,两个指针同时++
    {
        if(a[j]<a[k])         //要是前半部分的小,j++,k不动
            b[w++]=a[j++];
        else
            b[w++]=a[k++];    //要是后半部分的小,k++,j不动
    }
    if(k>right)               //循环结束后,一定会有的指针超过了原来的范围,要么是j>i+,要么k>right
    {
        for(int m=j;m<=i;m++)  //说明前半段还有剩的,b必须把这部分的给加进去,不过这次不用比较了,
        b[w++]=a[m];           //因为已经是递增的了,直接一个for循环搞定
    }
    else                       //同理
    {
        for(int m=k;m<=right;m++)
            b[w++]=a[m];
    }
}

void copy(int a[],int b[],int left,int right)/*把b中从left到right的所有元素统统复制到a中*/
{
    for(int i=left;i<=right;i++)
    {
        a[i]=b[i];
    }
}

void MergeSort(int a[],int left,int right)/*递归方程,归并排序的核心思想就在这里*/
{
    int *b=(int *)malloc((right-left+1)*sizeof(int)); //开辟一个b数组,便于后面把分好两类的数组合并然后放到b里面去,这样不会浪费内存哟!
    if(left<right)                     //前提是必须要满足left<right的
    {
        int i=(left+right)/2;          //二分的思想
        MergeSort(a,left,i);           //对左半部分进行递归调用
        MergeSort(a,i+1,right);        //对右半部分进行递归调用
        Merge(a,b,left,i,right);       //此时左右两边都已经排好序了,在把它们俩合并装到b里边儿
        copy(a,b,left,right);          //装到b里面之后,当然还要装回a啊,因为这个函数要改变的是a,b只是一个中间变量,类似于交换时的temp
    }
}
int main()
{
    int n,a[20];
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    MergeSort(a,0,n-1);
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值