输入描述:
输入有两行,第一行n 第二行是n个空格隔开的字符串
输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格
示例1
输入
5 c d a bb e
输出
a bb c d e
1.0版本:采用的是将字符串读入一个char**数组中,这个数组中的每个元素都是一个字符串char*,然后每个字符串的长度都不相同,然后使用冒泡排序的方式排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char** a,char** b){
char* tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
int n;
scanf("%d",&n);
char* buf[n];
char* str = (char*)malloc(sizeof(char) * 100);
for(int i = 0; i < n; i++){
scanf("%s",str);
int len = strlen(str);
buf[i] = (char*)malloc(sizeof(char) * (len+1));
strcpy(buf[i], str);
}
for(int i = 0; i < n-1 ; i++){
for(int j = i; j < n; j++){
if(strcmp(buf[i],buf[j]) > 0){
swap(&buf[i], &buf[j]);
}
}
}
for(int i = 0; i < n-1; i++){
printf("%s ",buf[i]);
}
puts(buf[n-1]);
}
1.1版本:采用定长的字符数组char buf[n][100]存储字符串,这样做看上去有些浪费空间。然后采用快速排序,使用库函数qsort,比较函数cmp使用库函数strcmp.代码量相对简洁。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int n;
scanf("%d",&n);
char buf[n][100];
for(int i = 0; i < n; i++){
scanf("%s",buf[i]);
}
qsort(buf,n,sizeof(buf[0]),strcmp);
for(int i = 0; i < n; i++){
printf("%s ",buf[i]);
}
}
看到这里你是不是想把1.0和1.1结合起来,在1.0的版本上采用快速排序的方式,写下这样一行代码:
qsort(buf, n, sizeof(char)*100, strcmp);
然而会有下面的错误
究其原因是buf中的每个元素的大小不同,不能使用100字节为单元作为比较,这有可能侵犯其他元素的内存,这也是qsort的本质,适合个数组排序,不适合给指针元素排序。
综上:1.0内存占用少,排序慢;
1.1时间复杂度低,空间复杂度高。