成绩排序

题目描述

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

示例:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩 
peter     96 
jack      70 
Tom       70 
smith     67

从低到高

smith     67

jack      70 
Tom      70 
peter     96

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50

方法一:
思路:稳定排序的应用,利用数组存放键值对(注意,可能出现相同键,即相同的姓名,利用出现的次序进行简单处理),应用分数构成规则1,利用出现的先后顺序构成规则2,利用函数array_multisort进行排序

<?
//稳定排序
function stableSort( $msgs, $sortFlag )
{
    $scores = array_values($msgs);   //分数规则
    $elements = array_keys($msgs);   //元素
    $elementOrder = array_keys($elements);    //出现先后顺序规则
    if ($sortFlag == 1)
    {
        array_multisort( $scores, SORT_ASC, $elementOrder, SORT_ASC );
    }
    else
    {
        array_multisort( $scores, SORT_DESC, $elementOrder, SORT_ASC );
    }
    foreach ($elementOrder as $order)
    {
        $element = explode(" ",$elements[$order])[0];
        $score = $msgs[$elements[$order]];
        print $element." ".$score."\n";
    }
}

function main()
{
    while ( $num = trim(fgets(STDIN)) )
    {
        $sortFlag = trim(fgets(STDIN));
        $i = 0;
        $msgs = array();
        while ( $i < intval($num) )
        {
            $record = trim(fgets(STDIN));
            //可能出现同名的但成绩不同的情况
            $name = explode(" ", $record)[0];
            $score = explode(" ", $record)[1];
            $msgs[$name." ".$i] = $score;
            $i++;
        }
        stableSort($msgs, intval($sortFlag));
    }
}
main();

 方法二:将姓名和成绩分开存储,避免对姓名的特殊处理

<?
//稳定排序
function stableSort( $names, $scores, $sortFlag )
{

    $elementOrder = array_keys($names);    //出现先后顺序规则
    if ($sortFlag == 1)
    {
        array_multisort( $scores, SORT_ASC, $elementOrder, SORT_ASC );
    }
    else
    {
        array_multisort( $scores, SORT_DESC, $elementOrder, SORT_ASC );
    }
    //score已排序,而name未排序,elementOrder记录name出现的先后顺序
    $i = 0;
    foreach ($elementOrder as $order)
    {
        $element = $names[$order];
        $score = $scores[$i++];
        print $element." ".$score."\n";
    }

}

function main()
{
    while ( $num = trim(fgets(STDIN)) )
    {
        $sortFlag = trim(fgets(STDIN));
        $i = 0;
        $names = array();
        $scores = array();
        while ( $i < intval($num) )
        {
            $record = trim(fgets(STDIN));
            //可以直接生成分数规则
            $names[] = explode(" ", $record)[0];
            $scores[] = explode(" ", $record)[1];
            $i++;
        }
        stableSort($names, $scores, intval($sortFlag));
    }
}

main();

 

 
 

posted on 2018-10-22 20:47  小不点20  阅读(147)  评论(0编辑  收藏  举报

导航