pta冒泡排序c语言_PTA7-30 字符串的冒泡排序(20 分)通俗雙解法

我們已經知道了將N個整數按從小到大排序的冒泡排序法。本題要求將此方法用於字符串序列,並對任意給定的K(

輸入格式:

輸入在第1行中給出N和K(1≤K

輸出格式:

輸出冒泡排序法掃描完第K遍后的中間結果序列,每行包含一個字符串。

輸入樣例:

6 2

best

cat

east

a

free

day

輸出樣例:

best

a

cat

day

east

free

這道題為什么有20分?一方面是涉及排序算法,另一方面估計是考察你在不用函數庫提供的某些函數的情況下解決此題,如果此題不用函數庫提供的一些函數,那么此題將會比用函數難上一個台階。拿C語言來說,如果不用strcmp,你自己手動寫一個,是要花相當多的時間的,難點就在於比較首字符,再比較后續字符的算法如何寫。但是如果你用了函數,那就沒什么思維含量了。所以以下先描述下C++手動比較的算法:

定義一個字符串數組,在字符串首字符相等的情況下,思路是平行移動比較后續字符,循環變量的上限是兩字符串的長度最小者,如果字符逆序,交換,退出循環,如果字符順序,退出循環,如果字符相等,繼續比較下一個。比如第一個字符串是abc,第二個是ab,則比完a和b啥也沒做循環就結束了。第一個是abc,第二個是acb,比到第二個字符判定是順序的就退出循環。第一個是acb,第二個是abc,第二個字符逆序,將兩字符串在字符串數組中的位置交換,退出循環,以下是具體代碼:

#include

#include

#include

using namespace std;

int main()

{

int N,K;

cin>>N>>K;

string s[N];/*定義字符串數組*/

for(int i=0;i

cin>>s[i];

for(int i=0;i

for(int j=0;j

{

if(s[j][0]>s[j+1][0])/*如果兩個串的首個字符逆序*/

swap(s[j],s[j+1]);

else if(s[j][0]==s[j+1][0])/*如果兩個串的首個字符相等*/

{

int minlen=min(s[j].length(),s[j+1].length());/*取兩串的長度最小者*/

for(int k=0;k

{

if(s[j][k]>s[j+1][k])/*如果字符逆序*/

{

swap(s[j],s[j+1]);

break;/*交換后退出*/

}

else if(s[j][k]

break;/*退出*/

}

}

}

for(int i=0;i

cout<

return 0;

}

如果用了比較函數呢?C語言是strcmp,交換時用臨時字符串通過strcpy來完成,但是C++不用比較函數,本身自帶的函數庫用起來會有開掛的效果。。直接像比較數字那樣寫就行了。。代碼如下:

#include

#include

#include

using namespace std;

int main()

{

int N,K;

cin>>N>>K;

string s[N];

for(int i=0;i

cin>>s[i];

for(int i=0;i

for(int j=0;j

if(s[j]>s[j+1])

swap(s[j],s[j+1]);

for(int i=0;i

cout<

return 0;

}綜上,字符串問題,如果實在想不出來相關算法,可以用函數庫自帶的一些函數解決,但最好是自己先努力想,這樣才能提高編程功底。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值