夜深人静写算法——合并排序(分治,递归)

 

合并排序:
采用分治的方法。

第一步:

(1) 将数组分成两部分

(2)然后将分开的数组当成一个新的数组 ,重复操作(1),直到数组的大小为1.

第二步:
将分开的已排好的小数组进行合并(按照一定的顺序)。

因为最小的数组的大小为1,然后进行合并的排序,所以可以保证小数组总是排好序的

夜深人静写算法——合并排序(分治,递归)_第1张图片

#include 
#include 
#include 
#define MAX 100
using namespace std;

template 
void Merge(Type a[MAX],int left1,int right1,int left2,int right2)//合并两个数组 
{         //将数组a的第left1到第right1 和 数组a的第left2到right2 进行合并

	int str1 = left1,str2 = left2; 
	int length  = 0 ;
	Type b[MAX];
	
	while(str1 <= right1 && str2 <= right2){
		if(a[str1] < a[str2]){
			b[length++] = a[str1++];
		 
		}else
			b[length++] = a[str2++];	 
	}
	
	if(str1 <= right1)
		for(int i = str1; i <= right1 ; i++)
			b[length++] = a[i];
	else if( str2 <= right2)
		for(int i = str2; i <= right2; i++)
			b[length++] = a[i];
	
 
	for(int i = left1 ; i < left1 + length; i++ ) //将合并好的数组b复制到a的原始位置(left1到right2)
		a[i] = b[i - left1] ;
	
	
} 

template 
void Mergesort(Type a[MAX],int left,int right){
	if(left < right){  //数组的大小至少为2
		int j= (left + right)/2; //将数组分为两部分,
		Mergesort(a,left,j); 
		Mergesort(a,j+1,right);
		Merge(a,left,j,j+1,right); //合并
	}
}
int main(){
	int a[10] = { 2,1,5,4,3,7,6,8,9,0};
	
	for(int i = 0; i <10 ; i++){
		cout<

 

你可能感兴趣的:(夜深人静写算法)