王道論壇計算機考研機試指南 一 排序

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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容