算法系列-归并排序

时间复杂度:O(nlogn).
空间复杂度:O(n).

基本思路:

将数组分成2组A,B,如果这2组组内的数据都是有序的,那么就可以很方便的将这2组数据进行排序。如何让这2组组内数据有序?

可以将A,B组各自再分成2组。依次类推,当分出来的小组只有1个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的2个小组。这样通过先递归的分解数列,再合并数列就完成了归并排序

#include <iostream>
using namespace std;

void print(int a[], int n)
{
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

void Merge(int a[], int first, int mid, int last)
{//将2个有序数列a[first...mid]和a[mid...last]合并。
    int *tmp=new int[last-first+1];//临时合并序列
    int m=mid, n=last;//m,n分别为第1段序列、第2段序列的结尾
    //i,j,k分别为第1段序列、第2段序列,以及临时合并序列的下标
    int i=first, j=mid+1, k=0;//i,j,k分别为第1段序列、第2段序列,以及临时合并序列的下标
    //(1)实现将两个有序序列合并
    while(i<=m && j<=n)
    {
        if(a[i]<=a[j]) tmp[k++]=a[i++];
        else tmp[k++]=a[j++];
    }
    while(i<=m)
    {
        tmp[k++]=a[i++];
    }
    while(j<=n)
    {
        tmp[k++]=a[j++];
    }
    //(2)将合并序列复制到原始序列中
    for(i=0;i<k;i++)
    {
        a[first+i]=tmp[i];
    }
    delete[] tmp;
}
//归并排序
void MergeSort(int a[], int first, int last)
{
    if(first<last)
    {
        int mid=first+(last-first)/2;
        MergeSort(a, first, mid);//左边有序
        MergeSort(a, mid+1, last);//右边有序
        Merge(a, first, mid, last);//将二个有序数列合并
    }
}

int main()
{

    int a1[]={6,2,8,3,5,5,20,32,1};
    //int a2[]={2,8,5,5,6,20,32,1,77,19,2};
    //int a3[]={17,5,8,3,88,5,20,32,3};
    int n1=sizeof(a1)/sizeof(a1[0]);
    //int n2=sizeof(a2)/sizeof(a2[0]);
    //int n3=sizeof(a3)/sizeof(a3[0]);
    MergeSort(a1, 0, n1-1);
    print(a1, n1);

    return 0;
}

结果:

1 2 3 5 5 6 8 20 32

Process returned 0 (0x0)   execution time : 0.607 s
Press any key to continue.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值