转自: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;
}