归并排序C程序详解

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;
//归并算法
void merge(int *a,int begin1, int end1, int begin2, int end2, int *tmp)
{
    //进行划分为[begin1,end1],[begin2,end2]的双区间,一个tmp表示为,只要传进一个tmp就可以不用每次开辟新的tmp数组了
    int index=begin1;
    int i=begin1,j=begin2;
    while (i<=end1&&j<=end2){//小的进行归并
        if (a[i]<=a[j]) tmp[index++]=a[i++];
        else tmp[index++]=a[j++];
    }
    while (i<=end1) tmp[index++]=a[i++];//1数组未结束,归并1数组
    while (j<=end2) tmp[index++]=a[j++];//2数组未结束,归并2数组
    memcpy(a+begin1,tmp+begin1,sizeof(int)*(end2 - begin1 + 1));//开呗至原数组
}
//归并排序
void MergeSort(int *a, int left, int right, int *tmp)
{
    if(left>=right) return;//左大于右,返回
    int mid=left+((right-left)>>1);//取mid值
    MergeSort(a,left,mid,tmp);//进行left到mid进行递归
    MergeSort(a,mid+1,right,tmp);//进行right到mid进行递归
    merge(a,left,mid,mid+1,right,tmp);//归并
}

int main(){
    int a[]={3,7,0,40,25,10,2,1};
    int *tmp=(int*)malloc(sizeof(int)*(sizeof(a)/sizeof(int)));
    memset(tmp,-1,sizeof(a)/sizeof(int));
    MergeSort(a,0,sizeof(a)/sizeof(int)-1, tmp);
    for(int i=0;i<sizeof(a)/sizeof(int);i++) cout<<a[i]<<" ";
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/littlepage/p/11648293.html