一道題了解---合併排序

題目描述

這是一個很簡單的排序題目. 爲了鍛鍊大家對不同算法的瞭解,請大家用歸併排序法對此題進行解答. 對一組整數數列A[1],A[2],A[3]......A[N]進行排序,按照從小到大的順序輸出.

輸入

本題只有一組測試數據,在輸入的第一行輸入N(表示整數數列的大小)(N < 1000)
接下來N行輸入N個整數,每一行一個整數.

輸出

對已經排好序的數從小到大依次輸出,每兩個數之間用兩個空格隔開,且每輸出10個數換行.

樣例

12
45 
545 
48 
47 
44 
45 
4857 
58 
57 
485 
1255 
42

樣例輸出

42  44  45  45  47  48  57  58  485  545
1255  4857

代碼 

 

#include<cstdio>
#include<iostream>
using namespace std;
int A[1000],B[1000];
void merge(int *A, int start,int mid, int end){//歸併
	int i = start, j = mid + 1;
	int k = i;
	while( i <= mid && j <= end){
		if(A[i] <= A[j]){
			B[k++] = A[i++];
		}
		else B[k++] = A[j++];	
	}
	if(i == mid + 1){
		while(j <= end)
			B[k++] = A[j++];
	}
	else if(j == end + 1)
	{
		while(i <= mid)
			B[k++] = A[i++];
	}
	for(int i = start; i <= end; i++)
		A[i] = B[i];
}
void merge_sort(int *A, int start, int end){//分治、一分爲二
	int mid = (start+end)/2;
	if(start < end ){
		merge_sort(A,start,mid);
		merge_sort(A,mid + 1,end);
		merge(A,start,mid,end);
	}
}
int main(){
	int n;
	cin>>n;
	for(int i = 0; i < n; i++){
		cin>>A[i];
	}
	merge_sort(A,0,n-1);
	for(int i = 0 ; i < n; i++){
		cout<<A[i];
		if((i + 1)%10==0 || i == n - 1)
			cout<<endl;
		else cout<<"  ";//注意是兩個空格
	}
	return 0;
}

思路

  1. 合併排序是成功應用分治技術的一個完美例子;
  2. 合併排序有較好的穩定性;
  3. 對於一個需要排序的數組A[0..n-1],合併排序把它一分爲二:A[0..n/2-1] 和 A[n/2..n-1],並對每個子數組遞歸排序,然後把這兩個排序好的子數組合併爲一個有序數組。
  4. 圖例: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章