7-2 英文单词排序 (25 分)

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:

输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:

输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple
#

输出样例:

red blue green yellow purple 

 很简单的一个小题,上来就用sort排序,第三个测试点死活过不去。。。?

 

错误代码

短短几行,却看不出那儿有?️‍♂️问题

找不到点,可真让人难受

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(string a,string b){
	return a.size()<b.size();
}

int main(){
	string s;
	string s1[25];
	int i=0;
	cin>>s;
	while(s!="#"){
		s1[i]=s;
		i++;
		cin>>s;
	}
	sort(s1,s1+i,cmp);
	for(int a=0;a<i;a++){
		cout<<s1[a]<<" ";
	}
	return 0;
}

经过一番思考?(其实是问了别人之后)

我才知道sort排序是不稳定的,不能保证如果长度相同,按照输入的顺序不变。

既然这样,那么我就用冒泡排序了?

 

AC代码

#include<iostream>
using namespace std;
int main(){
	string s;
	string s1[25];
	int i=0;
	cin>>s;
	while(s!="#"){
		s1[i]=s;
		//cout<<s1[i]<<i<<endl;
		i++;
		cin>>s;
	}
	for(int a=0;a<i-1;a++){//sort 不稳定 试试冒泡
	 	for(int b=i-1;b>a;b--){
	 		if(s1[b-1].size()>s1[b].size()){
	 			s=s1[b];
	 			s1[b]=s1[b-1];
	 			s1[b-1]=s;
			 }
		 }
	 } 
	for(int a=0;a<i;a++){
		cout<<s1[a]<<" ";
	}
	return 0;
}

这道题别人都没遇到问题,就我直接整了sort就出问题了+

+既然都用sort了,那就贯彻到底吧。

后面就想了一个没啥用,但是sort也过去的代码

AC代码

#include<iostream>
#include<algorithm>
using namespace std;
struct s2{
	string s;
	int n;
};
bool cmp(s2 a,s2 b){
	return a.s.size()==b.s.size()?a.n<b.n:a.s.size()<b.s.size();
}

int main(){
	
	string s;
	s2 s1[25];
	int i=0;
	cin>>s;
	while(s!="#"){
		s1[i].s=s;
		s1[i].n=i;
		i++;
		cin>>s;
	}
	sort(s1,s1+i,cmp);
	for(int a=0;a<i;a++){
		cout<<s1[a].s<<" ";
	}
	return 0;
}

使用了结构体,一个存string一个存顺序,改了sort里的cmp,

过是过了,但是不太提倡,

通过这个题要记住sort它不稳定啊。。。一定要判断顺序。

(说明一定要了解多一丢丢比如sort,单知道他排序就不行,还有冒泡我很长时间没✍写了,写的时候我还查了资料。。。)