当前位置 博文首页 > SYP___:夜深人静写算法——合并排序(分治,递归)

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

    作者:[db:作者] 时间:2021-06-06 17:26

    ?

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

    第一步:

    (1) 将数组分成两部分

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

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

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

    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #define MAX 100
    using namespace std;
    
    template <class Type>
    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 <class Type>
    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<<a[i];
    		if(i!= 9)cout<<" ";
    		else cout<<endl;
    	}
    	
    	Mergesort(a,0,9);
    	
    	cout<<"排序后\n"; 
    	for(int i = 0; i <10 ; i++){
    		cout<<a[i];
    		if(i!= 9)cout<<" ";
    		else cout<<endl;
    	}
    	
    	return 0;	
    	
    }

    ?