试题描述:给定n个字符串,请对n个字符串按照字典序排列
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define StringSize 100
int main()
{
int N;
scanf("%d", &N);
getchar();
int i = 0, j = 0;
char* str[N];
//int num[N];
for(i = 0; i < N; i++)
{
str[i] = (char*)malloc(sizeof(char) * StringSize);
gets(str[i]);
}
for(i = 0; i < N - 1; i++)
{
for(j = 0; j < N-i-1; j++)
{
if(strcmp(str[j], str[j+1]) > 0)
{
char tmp[100];
strcpy(tmp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], tmp);
}
}
}
for(i = 0; i < N; i++)
{
printf("%s\n", str[i]);
}
}
此题默认区分大小写,即大写字母永远小于小写字母,例如Z<a;如果不区分,则应该如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define StringSize 100
int compare(char* p1, char* p2, int n1, int n2)
{
//int flag;
int n;
if(n1 < n2)
n = n1;
else
n = n2;
int i = 0;
for(i = 0; i < n; i++)
{
char tmp1 = p1[i];
char tmp2 = p2[i];
if((int)tmp1 < 97)
{
tmp1 = tmp1 + 32;
}
if((int)tmp2 < 97)
{
tmp2 = p2[i] + 32;
}
if((int)tmp1 < (int)tmp2)
return 0;
else if((int)tmp1 == (int)tmp2)
{
if(n1 < n2)
return 0;
else
return 1;
}
else
return 1;
}
}
int main()
{
int N;
scanf("%d", &N);
getchar();
int i = 0, j = 0;
char* str[N];
//int num[N];
for(i = 0; i < N; i++)
{
str[i] = (char*)malloc(sizeof(char) * StringSize);
gets(str[i]);
}
for(i = 0; i < N - 1; i++)
{
for(j = 0; j < N-i-1; j++)
{
if(compare(str[j], str[j+1], strlen(str[j]), strlen(str[j+1])))
{
char tmp[100];
strcpy(tmp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], tmp);
}
}
}
for(i = 0; i < N; i++)
{
printf("%s\n", str[i]);
}
}
网友评论