归并排序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;
}
posted @ 2019-10-10 15:29  SteveYu  阅读(538)  评论(0编辑  收藏  举报