天天看點

5-2 字元串的冒泡排序 (20分)

我們已經知道了将個整數按從小到大排序的冒泡排序法。本題要求将此方法用于字元串序列,并對任意給定的(),輸出掃描完第遍後的中間結果序列。

輸入格式:

輸入在第1行中給出和(),此後行,每行包含一個長度不超過10的、僅由小寫英文字母組成的非空字元串。

輸出格式:

輸入樣例:

6 2
best
cat
east
a
free
day      

輸出樣例:

best
a
cat
day
east
free#include<stdio.h>
#include<string.h>
struct cmpStr{
    char str[15];//定義字元串
};
struct cmpStr sort[105];//定義結構題數組的大小
int main(){
    int n,k;//定義n行,循環k次的變量
    scanf("%d%d",&n,&k);
    getchar();//吃掉一個回車符
    int i=0;//定義一個計數器初始化為0
    while(n--){//循環n次依次接收輸入的字元串
        gets(sort[i].str);//将輸入的字元串存入到定義的結構體數組中去
        i++;//計數器每次加一
    }
    n=i;//将n的值重新指派回來
    i=0;//再次初始化i的值
    int j=0;//定義一個内層的循環的計數器,初始話它的值為0
    char temp[15];//定義一個零時存放字元串的字元串數組
    for(i=0;i<k;i++){//外層循環k次
        for(j=0;j<n-1-i;j++){//内層循環n-1次
            if(strcmp(sort[j].str,sort[j+1].str)>0){//比較兩個字元串的大小
                strcpy(temp,sort[j].str);//這裡要注意的是使用字元串的指派函數才行不能直接使用=
                strcpy(sort[j].str,sort[j+1].str);
                strcpy(sort[j+1].str,temp);
            }
        }
    }
    i=0;//初始化i的值
    n--;//最後一個不能有空格
    while(n--){
        printf("%s\n",sort[i].str);//列印輸出排序之後的字元串
        i++;//計數器加一
    }
    printf("%s",sort[i].str);
    return 0;
}