csuoj 1215 稳定排序

经过一位大牛的指点,放弃了使用分治的念头,看来快排还是很灵活的。

 1 # include <stdio.h>
2 # include <stdlib.h>
3
4 # define MAXN 100005
5
6 typedef struct {
7 int X, Y;
8 int I;
9 }data;
10
11 data a[MAXN];
12
13 int cmp(const void *a, const void *b)
14 {
15 if ((*(data*)a).X == (*(data*)b).X)
16 return (*(data*)a).I-(*(data*)b).I;
17 return (*(data*)a).X - (*(data*)b).X;
18 }
19
20 int main()
21 {
22 int n, i;
23
24 while (~scanf("%d", &n))
25 {
26 for (i = 0; i < n; ++i)
27 {
28 a[i].I = i;
29 scanf("%d%d", &a[i].X, &a[i].Y);
30 }
31 qsort(a, n, sizeof(data), cmp);
32 for (i = 0; i < n; ++i)
33 printf("%d %d\n", a[i].X, a[i].Y);
34 }
35
36 return 0;
37 }

刚看到一个qsort的提示:return (*(int *)a - *(int *)b);可能会溢出,所以较好的写法是:

int compare (const void * a, const void * b)
{
return ( *(int*)a > *(int*)b ? 1 : -1);
}



原文地址:https://www.cnblogs.com/JMDWQ/p/2428983.html