码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法总结(二)归并法

时间:2015-03-12 11:32:51      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:排序算法

递归法

#include<iostream>
using namespace std;
void Merge(int r[],int r1[],int b,int m,int e){
	int i=b;
	int j=m+1;
	int k=b;
	while((i<=m)&&(j<=e)){
		if(r[i]<=r[j]){
		r1[k]=r[i];
		i++;
		k++;}
		else{
		r1[k]=r[j];
		j++;
		k++;}

	}
	if((i<=m)){
		while(i<=m){
		r1[k++]=r[i++];}
	}
	else if(j<=e){
		while(j<=e){
		r1[k++]=r[j++];}
	}	
}
void MergeSort(int r[],int r1[],int s,int t){
	int r2[100];
	if (s==t){
		r1[s]=r[s];
	}
	else{
		int m=(s+t)/2;
		MergeSort(r,r2,s,m);
		MergeSort(r,r2,m+1,t);
		Merge(r2,r1,s,m,t);
	}
}
void main(){
	int a[7]={8,7,9,3,4,1,2};
	MergeSort(a,a,0,6);//递归调用 使得可以更新a值
	for(int i=0;i<7;i++){
	cout<<a[i]<<' ';}
	system("pause");
}

非递归法

#include<iostream>
using namespace std;
void Merge(int r[],int r1[],int b,int m,int e){//一次归并
	int i=b,j=m+1,k=b;
	while((i<=m)&&(j<=e)){
		if(r[i]>=r[j]){
			r1[k++]=r[i++];
		}
		else{
			r1[k++]=r[j++];
		}
	}
	if(i<=m){
		while(i<=m)
			r1[k++]=r[i++];
	}
	else if(j<=e){
		while(j<=e)
			r1[k++]=r[j++];
	}
}
void MergePass(int r[],int r1[],int n,int h){//一趟排序
	int i=0;
	while(i<=n-2*h){
		Merge(r,r1,i,i+h-1,i+2*h-1);
		i=i+2*h;
	}
	if(i<n-h){
		Merge(r,r1,i,i+h-1,n-1);
	}
	else{
		for(int s=i;s<n;s++){
			r1[s]=r[s];
		}
	}
	
}
void MergeSort(int r[],int r1[],int n){
	int h=1;
	while(h<n){
		MergePass(r,r1,n,h);
		h=h*2;
		for(int i=0;i<n;i++){
			r[i]=r1[i];//更新序列值
		}
	}	
}
void main(){
	int a[7]={8,7,9,4,1,2,3};
	int b[7];//非递归
	MergeSort(a,b,7);
	for(int i=0;i<7;i++){
		cout<<b[i]<<' ';}
	system("pause");
}


排序算法总结(二)归并法

标签:排序算法

原文地址:http://blog.csdn.net/eliza1130/article/details/44218903

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!