2013.01.06
第2章 經典入門
一 排序
例2.1 | 排序 | (九度教程第1題) |
---|---|---|
時間限制:1秒 | **內存限制:32兆 ** | 特殊判題:否 |
題目描述:對輸入的n個數進行排序并輸出。
輸入:輸入的第一行包括一個整數n(1<=n<=100)。接下來的一行包括n個整數。
輸出:可能有多組測試數據,對于每組數據,將排序后的n個整數輸出,每個數后面都有一個空格。每組測試數據的結果占一行。
樣例輸入:
4
1 4 3 2
樣例輸出:
1 2 3 4
來源:
2006年華中科技大學計算機保研機試真題
代碼 2.1C
#include <stdio.h>
int main () {
int n;
int buf[100]; //定義我們將要使用的變量n,并用buf[100]來保存將要排序的數字
while (scanf ("%d",&n) != EOF) { //輸入n,并實現多組數據的輸入
//該循環判斷條件既保證了可以對多組測試數據進行計算,同時又使程序在輸入結束后能夠正常的退出。
for (int i = 0;i < n;i ++) {
scanf ("%d",&buf[i]);
} //輸入待排序數字
for (int i = 0;i < n;i ++) {
for (int j = 0;j < n - 1 - i;j ++) {
if (buf[j] > buf[j + 1]) {
int tmp = buf[j];
buf[j] = buf[j + 1];
buf[j + 1] = tmp;
}
}
} //冒泡排序主體
for (int i = 0;i < n;i ++) {
printf("%d ",buf[i]);
} //輸出完成排序后的數字,注意,題面輸出要求在每個數字后都添加一個空格
printf("\n"); //輸出換行
}
return 0;
}
代碼2.2C++
#include <stdio.h>
#include <algorithm>
using namespace std;
int main () {
int n;
int buf[10000];
while (scanf ("%d",&n) != EOF) {
for (int i = 0;i < n;i ++) {
scanf ("%d",&buf[i]);
}
sort (buf,buf + n); //使用該重載形式,表明將要使用自己定義的排列規則
//sort(起始地址,結束地址)已經通過快速排序升序排列
for (int i = 0;i < n;i ++) {
printf("%d ",buf[i]);
}
printf("\n");
}
return 0;
}
代碼 2.3 降序C++
#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp (int x,int y) { //定義排序規則
return x > y;
}
int main () {
int n;
int buf[100];
while (scanf ("%d",&n) != EOF) {
for (int i = 0;i < n;i ++) {
scanf ("%d",&buf[i]);
}
sort (buf,buf + n,cmp); //使用該重載形式,我們表明將要使用自己定義的排列規則
//sort(排序起始地址,排序結束地址,比較函數)
for (int i = 0;i < n;i ++) {
printf("%d ",buf[i]);
}
printf("\n");
}
return 0;
}
例2.2 | 成績排序 | (九度教程第2題) |
---|---|---|
時間限制:1秒 | **內存限制:32兆 ** | 特殊判題:否 |
**題目描述: **有 N 個學生的數據,將學生數據按成績高低排序,如果成績相同則按姓名 字符的字母序排序,如果姓名的字母序也相同則按照學生的年齡排序,并輸出 N 個學生排序后的信息。
**輸入: **測試數據有多組,每組輸入第一行有一個整數 N(N<=1000),接下來的 N 行包括 N 個學生的數據。每個學生的數據包括姓名(長度不超過 100 的字符串) 、 年齡(整形數)、成績(小于等于 100 的正數)。
**輸出: **將學生信息按成績進行排序,成績相同的則按姓名的字母序進行排序。然后 輸出學生信息,按照如下格式:姓名 年齡 成績
樣例輸入:
3
abc 20 99
bcd 19 97
bed 20 97
樣例輸出:
bcd 19 97
bed 20 97
abc 20 99
**提示: **
學生姓名的字母序區分字母的大小寫,如 A 要比 a 的字母序靠前(因為 A 的
ASC 碼比 a 的 ASC 碼要小)。
**來源: **
2000 年清華大學計算機研究生機試真題
代碼 2.4
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct E {
char name[101];
int age;
int score;
}buf[1000];
bool cmp(E a,E b) { //實現比較規則
if (a.score != b.score) return a.score < b.score; //若分數不相同則分數低者在前
int tmp = strcmp(a.name,b.name);
if (tmp != 0) return tmp < 0; //若分數相同則名字字典序小者在前
else return a.age < b.age; //若名字也相同則年齡小者在前
} //分數>名字>年齡
int main () {
int n;
while (scanf ("%d",&n) != EOF) {
for (int i = 0;i < n;i ++) {
scanf ("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
} // 輸入
sort(buf,buf + n,cmp); //利用自己定義的規則對數組進行排序
for (int i = 0;i < n;i ++) {
printf ("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
} //輸出排序后結果
}
return 0;
}
代碼2.5直接定義該結構體的小于運算符來說 明排序規則。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct E {
char name[101];
int age;
int score;
bool operator < (const E &b) const { //利用C++算符重載直接定義小于運算符
if (score != b.score) return score < b.score;
int tmp = strcmp(name,b.name)
if (tmp != 0) return tmp < 0;
else return age < b.age;
}
}buf[1000];
int main () {
int n;
while (scanf ("%d",&n) != EOF) {
for (int i = 0;i < n;i ++) {
scanf ("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
}
sort(buf,buf + n);
for (int i = 0;i < n;i ++) {
printf ("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
}
return 0;
}
練習題:特殊排序(九度教程第 3 題);EXCEL 排序(九度教程第 4 題);字符 串內排序(九度教程第 5 題);
題目1023 | EXCEL 排序 | (九度教程第4題) |
---|---|---|
時間限制:1秒 | **內存限制:32兆 ** | 特殊判題:否 |
題目描述:
Excel可以對一組紀錄按任意指定列排序。現請你編寫程序實現類似功能。
對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結果,即:當 C=1 時,按學號遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。
輸入:
測試輸入包含若干測試用例。每個測試用例的第1行包含兩個整數 N (N<=100000) 和 C,其中 N 是紀錄的條數,C 是指定排序的列號。以下有N行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,同組測試中沒有重復的學號)、姓名(不超過8位且不包含空格的字符串)、成績(閉區間[0, 100]內的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。
輸出:
對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結果,即:當 C=1 時,按學號遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。
樣例輸入:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
樣例輸出:
Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
來源:
2007年浙江大學計算機及軟件工程研究生機試真題
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct E {
char ID[10];
char name[10];
int score;
}buf[100001];
bool case1(E a, E b) {
int tmp = strcmp(a.ID,b.ID);
if (tmp != 0) return tmp< 0;
}
bool case2(E a, E b) {
int tmp = strcmp(a.name,b.name);
if (tmp !=0) return tmp<0;
tmp = strcmp(a.ID,b.ID);
if (tmp != 0) return tmp< 0;
}
bool case3(E a, E b) {
if (a.score != b. score) return a.score < b.score;
int tmp = strcmp(a.ID,b.ID);
if (tmp != 0) return tmp< 0;
}
int main() {
int a,b,k=1;//錯在case 1 2 3 4遞增
while (scanf("%d%d",&a,&b),a){
for(int i = 0; i < a; i++){
scanf("%s %s %d",&buf[i].ID,&buf[i].name,&buf[i].score);
}
if(b==1)sort(buf,buf+a,case1);
if(b==2)sort(buf,buf+a,case2);
if(b==3)sort(buf,buf+a,case3);
printf("Case %d:\n",k++);//錯在case 1 2 3 4遞增
for(int i = 0; i < a; i++){
printf("%s %s %d\n",buf[i].ID,buf[i].name,buf[i].score);
}
}
return 0;
}
題目1054 | 字符串內排序 | (九度教程第5題) |
---|---|---|
時間限制:1秒 | **內存限制:32兆 ** | 特殊判題:否 |
題目描述:
輸入一個字符串,長度小于等于200,然后將輸出按字符順序升序排序后的字符串。
輸入:
測試數據有多組,輸入字符串。
輸出:
對于每組輸入,輸出處理后的結果。
樣例輸入:
bacd
樣例輸出:
abcd
來源:
2010年哈爾濱工業大學計算機研究生機試真題
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int main(){
char a[200];
while(scanf("%s",&a) != EOF){
int n = strlen(a);
sort(a,a+n);
for( int i = 0; i < n; i++){
printf("%c",a[i]);
}
printf("\n");
}
return 0;
}