实验十一(2018)D. 实验9_20_字符串排序

拆分问题,也就是 读取字符串——排序字符串——输出字符串
字符串数目不定当然就用动态二维数组来存了,本来应该用指针写的,这里就偷懒用C99了
切记!scanf读完n后缓冲区还有一个回车!
务必用getchar()把回车吃掉,不然读入字符串时gets首先得到的是一个回车!!!!

正常对数组排序的话我们是把数组里的数不断交换排序的,现在操作的每个对象是字符串,显然交换字符串就不太现实
仔细想一想我们做了件什么事情,无非就是,啊,把最小的排到第一位,第二小的排到第二位,这样从0,1,2。。。遍历时可以按顺序输出
其实我们不需要把元素排序成这样啊,我们只需要告诉输出,首先输出的是第a个字符串,再输出第b个字符串,这样我们只需要告诉遍历,第几大的元素要到哪里找就可以了
举个例子:
d a c b四个字母,排序应该是a b c d,排序之前我们另创一个数组,给他们标号
0 1 2 3
排序时我们比较的元素时字母,但我们交换的却是序号
我们把序号排成
1 3 2 0
这样我们开始输出1对应的元素,也就是a,再输出3对应的元素,也就是b……
其实有字典类型的话会方便很多,Python有,C没有
(你怎么不把sort一起拿过来呢233)
所以我们比的是str[order[i]],str[order[j]],实际交换的确实order[i]和order[j],原来的字符串数组并没有动
最后遍历输出的是str[order[0,1,2,3…]]

#include <stdio.h>
int main(int argc, char const *argv[])
{
	int n,i,k,tmp;
	scanf("%d",&n);
	getchar();//EAT THAT BLANK
	char str[n][101];
	for(i=0;i<n;i++)
		gets(str[i]); 
	int order[n];
	for(i=0;i<n;i++)
		order[i]=i;
		
	for(i=1;i<n;i++)
		for(k=0;k<n-i;k++)
			if(strcmp(str[order[k]],str[order[k+1]])>0)
			{
				tmp=order[k];
				order[k]=order[k+1];
				order[k+1]=tmp;
			}
	for(i=0;i<n;i++)
		puts(str[order[i]]);
}

题目描述
问题描述:
整数可以按照大小来排序,其实字符串也可进行排序。排序时需要比较字符串大小。字符串比较规则见Problem13中对于strcmp功能的描述。任意给定n个字符串,字符串中可以包含除换行符之外的任意字符。你的任务是将这n个字符串从小到大进行排序,然后输出。

输入与输出要求:
输入一个不超过200的整数n,代表待排序字符串的个数。然后输入n个字符串,每个字符串长度不会超过100,以换行符结束。输出排序后的n个字符串,每个字符串占一行。

程序运行效果:
Sample 1:
5↙
bbb↙
zzzzzz↙
aabbbccc↙
aaaaaa↙
abbbbb↙
aaaaaa↙
aabbbccc↙
abbbbb↙
bbb↙
zzzzzz↙

Sample 2:
3↙
abbbbbb↙
abbbbbb↙
aaaa↙
aaaa↙
abbbbbb↙
abbbbbb↙

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值