归并排序的迭代算法

在归并排序的迭代算法中,可以把输入看成是n个已排列序列,其中每个序列的长度为1。将这些序列两两归并就可以得到n/2个长度为2的序列(若n为奇数,则还有一个长度为1的序列)。对这n/2个序列进行两两归并,依此类推,直到只剩下一个序列为止。

归并排序的迭代算法可以如下实现:

#define  MAX_SIZE  200
void merge(int list[],int sorted[],int i,int m,int n)
{
	/* merge two sorted files:list[i]...list[m] and 
	list[m+1]...list[n]. These files are sorted to 
	obtain a sorted list: sorted[i]...sorted[n]*/
	int j,k,t;
	j = m + 1;
	k = i;
	while (i<=m && j<=n)
	{
		if (list[i]<=list[j])
			sorted[k++] = list[i++];
		else
			sorted[k++] = list[j++];
	}
	if(i>m)
	/*sorted[k],...,sorted[n] = list[j],...,list[n]*/
		for(t=j;t<=n;t++)
			sorted[k+t-j] = list[t];
	else
	/*sorted[k],...,sorted[n] = list[i],...,list[m]*/
		for (t=i;t<=m;t++)
			sorted[k+t-i] = list[t];
}

void mergePass(int list[],int sorted[],int n,int length)
{
	/* perform one pass of the merge sort. It merges adjacent
	pairs of subfiles from list into sorted. n is the number
	of elements in the list. length is the length of the subfile
	*/
	int i,j;
	for (i=0;i<=n-2*length;i+=2*length)
		merge(list,sorted,i,i+length-1,i+2*length-1);
	if(i+length<n)
		merge(list,sorted,i,i+length-1,n-1);
	else
		for(j=i;j<n;j++)
			sorted[j] = list[j];
}

void mergeSort(int list[],int n)
{
	/* n is the length of list.*/
	int length = 1;
	int extra[MAX_SIZE];
	while(length<n)
	{
		mergePass(list,extra,n,length);
		length *= 2;
		mergePass(extra,list,n,length);
		length *= 2;
	}
}
测试程序:

void main()
{
	int a[10];
	srand((unsigned)time(NULL));
	for(int i=0;i<10;i++)
		cout<<(a[i] = rand() % (50 + 1))<<' ';
	cout<<endl;
	mergeSort(a,10);
	for(int i=0;i<10;i++)
		cout<<a[i]<<' ';
	cout<<'\n';
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值