读书人

请问一个排序方面的有关问题

发布时间: 2012-02-26 20:19:43 作者: rapoo

请教一个排序方面的问题
输入的第一行是一个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;} 

读书人网 >C++

热点推荐