请教一个排序方面的问题
输入的第一行是一个1到500000的整数N,表示总共有N位水王参加了争霸赛。
以下依次给出每位水王的描述,ID一行,发贴数一行,分别为一个仅由字母组成的长度不超过150的字符串和一个整数(非负数),注意,这个整数小于2,000,000,000。 除了子母、数字和必要的换行,输入中不会出现空格等字符。
依次输出按照发贴数从小到大排好序的各位水王的ID和这个水王的发贴数,ID和发贴数用空格分开。不能有任何多余的字符。若几个ID的发贴数相同,则按照ID输入的先后顺序进行排列。
例如:
输入:
6
Lowai
1986
Zhouyuan
2987
Maolaoda
2345
BuTaoCaiGuai
2548
ArthurKing
2003
Hyyylr
3185
输出:
Lowai 1986
ArthurKing 2003
Maolaoda 2345
BuTaoCaiGuai 2548
Zhouyuan 2987
Hyyylr 3185
我写的代码效率太低了..请哪位高手能帮小弟写一个效率比较高点的程序..
谢谢了..(注意输入数据很大)!!!
[解决办法]
如果可以用库函数的话就直接用 qsort 快速排序就行了,如果不行,就自己写一个快速排序的算法。
- C/C++ code
#include <stdio.h>#include <stdlib.h>struct WaterMan{ int nNO; int nCount; char szName[160];};int CompareProc( const void *pParam1, const void *pParam2 ){ WaterMan *pMan1 = (WaterMan *)pParam1; WaterMan *pMan2 = (WaterMan *)pParam2; if( pMan1->nCount == pMan2->nCount ) return pMan1->nNO - pMan2->nNO; else return pMan1->nCount - pMan2->nCount;}int main( int argc, char *argv[] ){ int N = 1000; scanf( "%d", &N ); WaterMan *pMans = new WaterMan[N]; for( int i = 0; i < N; i ++ ) { pMans[i].nNO = i + 1; scanf( "%s", pMans[i].szName ); scanf( "%d", &(pMans[i].nCount) ); } qsort( pMans, N, sizeof(WaterMan), CompareProc ); for( int i = 0; i < N; i ++ ) { printf( "%s %d\n", pMans[i].szName, pMans[i].nCount ); } return 0;}