题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
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." "; } } 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." "; } } 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();