排序算法--归并排序(MergeSort)


//归并排序的特点:递归的应用
//需要准确并深入的理解递归的思想

#include <iostream>
#include <string>
# define NUM 8
using namespace std;
void Msort(int* a, int*tmpa, int left, int right);
int* MergeSort(int* a, int N);
void Merge(int* a , int* tmpa, int L, int R, int rend);

void Msort(int* a, int*tmpa, int left, int right)
{
	int center=0;
	int j = 0;

	if(left < right){
		center = (left + right)/2;
		Msort(a, tmpa, left, center);
		Msort(a, tmpa, center+1, right);

		Merge(a, tmpa, left, center+1, right);
        cout<<left<<center+1<<right<<endl;
        for(j = left; j < right+1; j++){

            cout<<"a["<<j<<"]="<<tmpa[j]<<' ';
        }
        cout<<endl;
	}

}

int* MergeSort(int* a, int N)
{
	int * tmpa;//按照算法解析,tmpa是一个指向int型的指针
	tmpa=new int[NUM];
	if(tmpa!=NULL){
		Msort(a, tmpa, 0, N-1);
		delete [] tmpa;
	}
	else
		cout<<"there are no space for tmpa array!"<<endl;
	return a;
}

//需要合并的这个数组,是被分成已排序的左右两个部分
//该函数的作用是,将这个数组进行整体排序
//归并的核心思想
void Merge(int* a , int* tmpa, int L, int R, int rend)
{
	int i, lend, num, tmpos;
	int left;
	left = L;

	lend = R-1; //此处的R对应的其实只是整个数组的中心,也就是两个已排序数组的分界点而已,并不是整体的末尾
	tmpos = L;  //用来作为新数组的索引
	num = R-L+1;//需要合并的元素个数
	while(L <= lend && R <= rend){
		if(a[L] <= a[R])
			tmpa[tmpos++]=a[L++];

		else
			tmpa[tmpos++]=a[R++];

	}
	while(L <= lend)
		tmpa[tmpos++]=a[L++];

	while(R <= rend)
		tmpa[tmpos++]=a[R++];

	for(left; left <= rend; left++)
		a[left]=tmpa[left];
}	


int main()
{
	int unsorted[NUM]={24,13,26,1,2,27,38,15};
	//int tmp[8] = {0};
	MergeSort(unsorted,NUM);
	int i=0;
	/*for(i=0; i < NUM; i++){
		//cout<<"unsorted["<<i<<"]="<<unsorted[i]<<' ';
		cout<<unsorted[i]<<' ';
	}*/
	for(auto b :unsorted)
		cout<<b<<' ';
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值