CSU1215(歸併排序)
阿新 • • 發佈:2019-01-22
轉自:http://blog.csdn.net/nameofcsdn/article/details/52334111
題目:
Description
給出二元陣列a[MAXN][2],按第一個關鍵值從小到大排序後輸出,要求第一關鍵值相同情況下不改變原陣列次序
Input
每組資料第一行為整數n,1 <= n <= 10 ^ 5。
接下來n行每行兩個整數空格隔開。
Output
輸出排序後的陣列
Sample Input
3 2 4 1 0 2 3 3 4 2 0 4 0 2
Sample Output
1 0 2 4 2 3 0 4 0 2 4 2
思路:歸併排序是穩定的排序演算法,即等值元素不更改原陣列中位置,qsort是不穩定排序。
程式碼如下:
#include <iostream> #include <algorithm> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; struct num { int data1; int data2; int id; } Num[100005],T1[100005]; void merge_sort(num* A, int x,int y,num* T)//歸併排序:等值元素不更改原陣列中位置。 { if(y-x>1) { int m= x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,T); merge_sort(A,q,y,T); while(p<m||q<y) { if(q>=y||(p<m&&A[p].data1<=A[q].data1)) { T[i].data1=A[p].data1; T[i].data2=A[p].data2; T[i++].id=A[p++].id; } else { T[i].data1=A[q].data1; T[i].data2=A[q].data2; T[i++].id=A[q++].id; } } for(int i=x; i<y; i++) { A[i].data1=T[i].data1; A[i].data2=T[i].data2; A[i].id=T[i].id; } } } int main() { int n; while(scanf("%d",&n)!=EOF) { for (int i = 0; i < n; i++) { scanf("%d %d",&Num[i].data1,&Num[i].data2); Num[i].id=i; } merge_sort(Num,0,n,T1); for(int i=0; i<n; i++) { printf("%d %d\n",Num[i].data1,Num[i].data2); } } return 0; }