我们已经知道了将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
知识点
- 冒泡排序就是相邻两个值进行交换每次排好的是最后一个数据
所以两层循环都要从0开始 - 如果想要优化的话,可以把内层循环判断语句 a<n-1改成a<(n-i-1)因为最后的之前都排好了,可以优化,但是没有明显的必要
- strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
- strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*
- 如果要用getline() 一定要在之前加getchar() !!!!如果是cin>>就可以不用
代码一
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n,k;cin>>n>>k;
getchar();
string str[101];
for(int i=0;i<n;i++){
getline(cin,str[i]);
//cin>>str[i];
}
for(int j=0;j<k;j++){
for(int i=0;i<n-1-j;i++){
if(str[i]>str[i+1])
{
string b=str[i];
str[i]=str[i+1];
str[i+1]=b;
}
}
}
for(int i=0;i<n-1;i++){
cout<<str[i]<<endl;
}
cout<<str[n-1];
}
代码二
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int n,k; //n→有几个字符串,k→扫描几次
int i,j; //用于循环和数组下标
char a[100][11]; //用于存储字符串
char temp[11];
scanf("%d%d",&n,&k); //提供输入n、k的功能
getchar();
for(i=0;i<n;i++) //提供输入字符串的功能
scanf("%s",a[i]);
for(i=0;i<k;i++)
{
for(j=0;j<n-1-i;j++)
{
if(strcmp(a[j],a[j+1])>0)
{
strcpy(temp,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],temp);
}
}
}
for(i=0;i<n;i++)
printf("%s\n",a[i]);
return 0;
}
int的冒泡排序
#include<iostream>
using namespace std;
int main(){
int n,k; cin>>n>>k;
int arr[100];
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<k;i++){
for(int j=0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
for(int i=0;i<n-1;i++){
cout<<arr[i]<<' ';
}
cout<<arr[n-1];
}