用空格分隔的字符串排序

输入描述:

输入有两行,第一行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时间复杂度低,空间复杂度高。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值