MergeSort

//merge-sort
//input a[30]
//output a[30](ASC sequence)
//

#include "stdafx.h"
#include <time.h>
#include <iomanip>
#include<iostream>
using namespace std;

#define MAX 100
#define INFINITE 99999

void Merge(int* a,int p,int q,int r)
{
	int n1,n2,z;
	int *plhead,*prhead,*pl,*pr;
	n1=q-p+2;
	n2=r-q+1;
	plhead=new int[n1];
	prhead=new int[n2];

	z=p;
	pl=plhead;
	while(z!=q+1)//对while循环的操作:1:初始化循环变量2:在while循环体中,变量操作3:在while循环体中,初始化下一次循环变量
		*pl++=a[z++];
	*pl=INFINITE;

	z=q+1;
	pr=prhead;
	while(z!=r+1)
		*pr++=a[z++];
	*pr=INFINITE;

	pl=plhead;
	pr=prhead;
	z=p;
	while(*pl!=INFINITE&&*pr!=INFINITE)
	{
		if(*pl<*pr)
			a[z++]=*pl++;
		else
			a[z++]=*pr++;
	}
	if(*pl==INFINITE)
		while(*pr!=INFINITE)
			a[z++]=*pr++;
	else
		while(*pl!=INFINITE)
			a[z++]=*pl++;

	delete[] plhead;
	delete[] prhead;
}

void MergeSort(int* a, int p, int r)
{
	if(p<r)
	{
		int q=(p+r)/2;
		MergeSort(a,p,q);
		MergeSort(a,q+1,r);
		Merge(a,p,q,r);
		//		cout<<"("<<p<<","<<q<<")"<<setw(5)<<"("<<q+1<<","<<r<<")"<<setw(20)<<"merge:   "<<p<<setw(3)<<r<<endl;
		//     cout<<setw(8)<<"abce"<<endl;setw()的作用是设置其后面的输出("abce")占8个字符,输出是空格空格空格空格abce
	}
}


void main()
{
	int a[MAX];
	int i;
	srand((unsigned)time(NULL));//产生一个随机数种子
	for(i=0;i<MAX;i++)
	{
		RAND_MAX;
		a[i]=rand()%MAX;//rand() 从0到RAND_MAX中的一个随机数,RAND_MAX是系统定义的宏#define RAND_MAX 0x7fff
		cout<<a[i]<<" ";
	}
	cout<<endl;

	MergeSort(a,0,MAX-1);

	for(i=0;i<MAX;i++)
		cout<<a[i]<<" ";
	getchar();

}
//*p++;先操作*p,再把p+1个地址。
//(*p)++:把*p的内容加1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值