分治——合併排序

分治策略中有一個經典的算法就是合併排序,這個算法的精髓也是分治二字,分而治之。將一個大規模的問題分割成若干個同樣的小問題,小問題的規模很小,很容易解決,解決了小的問題後再對這些小問題的結果進行合併得到大規模問題的解答。

合併排序便是分治策略中比較經典的算法,首先是合併,兩個排列有序的數列經過合併後成爲有序的數組:代碼如下:

void _merge(int *A,int left,int middle,int right)
{
	int i=left,j=middle+1,k=0;
	int *C;
	C=new int[right-left+1];
	while(i<middle+1 && j<right+1)
	{
		if(A[i]<A[j])
		{
			C[k++]=A[i++];
		}
		else
		{
			C[k++]=A[j++];
		}
	}
	while(i<middle+1)
		C[k++]=A[i++];
	while(j<right+1)
		C[k++]=A[j++];
	for(int i=0;i<right-left+1;i++)
	{
		A[i+left]=C[i];
	}
	delete[] C;
}
上面的算法是將一個數組分成左右兩個進行合併,如果這左右的兩個數組都是排列有序的話,那麼合成的新的數列也是有序的,下面的任務就是怎麼將左右的兩個數列排列成有序的,方法就是用遞歸思想,不斷的遞歸,將數列不斷的劃分,劃分成最小的單元,只有一個數的時候,那麼再進行合併,合併成的數列便是有序數列了,代碼如下:

void _merge_sort(int *A,int left,int right)
{
	
	if(left<right)
	{
		int middle=(left+right)/2;
		_merge_sort(A,left,middle);
		_merge_sort(A,middle+1,right);
		_merge(A,left,middle,right);
	}
}
最後進行測試:

void main()
{
	int ib[]={2,3,1,0,9,1,3,5};
	int length=sizeof(ib)/sizeof(int);
	_merge_sort(ib,0,length-1);
	for(int i=0;i<length;i++)
	{
		cout<<ib[i]<<' ';
	}
}
結果如下:





發佈了57 篇原創文章 · 獲贊 35 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章