PTA第六題-字符串的冒泡排序
題目如下:
我們已經知道了將N個整數按從小到大排序的冒泡排序法。本題要求將此方法用於字符串序列,並對任意給定的K(<N),輸出掃描完第K遍後的中間結果序列。
輸入格式:
輸入在第1行中給出N和K(1≤K<N≤100),此後N行,每行包含一個長度不超過10的、僅由小寫英文字母組成的非空字符串。
輸出格式:
輸出冒泡排序法掃描完第K遍後的中間結果序列,每行包含一個字符串。
輸入樣例:
6 2
best
cat
east
a
free
day
輸出樣例:
best
a
cat
day
east
free
複習冒泡算法
對於數字的排序算法,之前大一時候寫過一個例程如下,可以先根據這個小demo來複習一下冒泡算法。
#include<stdio.h>
int main()
{
int i,k,str;
int a[10];
str=0;
for(i=0;i<10;i++)
scanf("%d\n",&a[i]);
printf("排序前:");
for(i=0;i<10;i++)
printf("%10d",a[i]);
printf("\n");
for(i=9;i>=0;i--)
{
for(k=0;k<=i;k++)
{
if(a[k]>a[k+1])
{
str=a[k];
a[k]=a[k+1];
a[k+1]=str;
}
}
}
printf("排序後:");
for(i=0;i<10;i++)
printf("%10d",a[i]);
printf("\n");
}
可以看出,冒泡排序的算法就是它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
因此我們只需要把數組中的數字換成字符串即可,這裏就需要開闢一個二維數組來存放若干個字符串。
其中可以利用strcmp函數來比較字符串的大小(或者說順序),其中strcmp函數的用法:strcmp函數是string compare(字符串比較)的縮寫,用於比較兩個字符串並根據比較結果返回整數。基本形式爲strcmp(str1,str2),若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數。
利用strcpy函數來完成字符串的複製。
代碼如下所示:
#include<stdio.h>
#include<string.h>
int main()
{
char s[110][20];
int n,m,i,j;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
}
for(i=0;i<m;i++)
{
for(j=0;j<n-i-1;j++)
{
if(strcmp(s[j],s[j+1])>0)
{
char t[20];
strcpy(t, s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],t);
}
}
}
for(i=0;i<n;i++)
printf("%s\n",s[i]);
}