重新撿起c語言-字符串的冒泡排序

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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章