给定 n 个字符串,请对 n 个字符串按照字典序排列。
数据范围: ,字符串长度满足
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
数据输出n行,输出结果为按照字典序排列的字符串。
9 cap to cat card two too up boat boot
boat boot cap card cat to too two up
#include <stdio.h> #include <string.h> int main() { int n; scanf("%d", &n); char str[100][1000]; for (int j = 0; j < n; j++) { scanf("%s", str[j]); } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (strcmp(str[j], str[j + 1]) == 1) { char temp[1000]; strcpy(temp, str[j + 1]); strcpy(str[j + 1], str[j]); strcpy(str[j], temp); } } } for (int i = 0; i < n; i++) { printf("%s\n", str[i]); } }本地IDEV C运行成功,提交到在线测试里面就不行了,有没有大佬看一下
#include "string.h" #include "stdio.h" //注意:题里提到字符串长度小于等于100,但我的二维数组设定后一维度为100时则发生段错误,设为1000则没有这个问题,不知道咋回事。 int main() { int n,i,a = 1; scanf("%d",&n); char str[1000][1000] = {},temp[1000] = {}; for(i = 0; i < n; i++) { scanf("%s",str[i]); } for(i = 0; i < n; i++) { for(a = 1;a < n-i;a++) { if(strcmp(str[i],str[i+a]) > 0 ) { strcpy(temp, str[i]); strcpy(str[i], str[i+a]); strcpy(str[i+a], temp); } } } for(i = 0;i<n;i++) { printf("%s\n",str[i]); } }
#include <stdio.h> #include <stdlib.h> #include <string.h> int compar(const void* a, const void* b) { return strcmp((const char*)a, (const char*)b); } int main() { int n, i = 0; scanf("%d", &n); char word[1000][101]; while (scanf("%s", word[i++]) != EOF) {} qsort(word, n, sizeof(word[0]), compar); for (int i = 0; i < n; i++) { printf("%s\n", word[i]); } return 0; }
# include <stdio.h> # include<string.h> # include<stdlib.h> //决定用字符串数组来做 定义字符串结构体,定义结构体数组;通过比较排序; int main() { int n,i = 0,j=0; char *p[1000],*temp; scanf("%d",&n); for (i=0; i<n; i++) {p[i] = (char *)malloc(101);scanf("%s",p[i]);} for(i = 0; i<n-1; i++){ for(int k = i+1; k<n; k++){ if(strcmp(p[i], p[k]) >0 ){temp = p[i];p[i] = p[k];p[k] = temp;} } printf("%s\n",p[i]);//puts(p[i]); } printf("%s\n",p[i]); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int i,j,n; char *tmp; scanf("%d", &n); char *str[n]; //接收字符串 for(i = 0; i < n; i++) { str[i] = (char*)malloc(101); memset(str[i], 0, 101); scanf("%s", str[i]); } //排序 for(i = 0; i < n; i++) { for(j = i + 1; j < n; j++) { if (strcmp(str[i], str[j]) > 0) { tmp = str[i]; str[i] = str[j]; str[j] = tmp; } } } //输出 for(i = 0; i < n; i++) { printf("%s\n", str[i]); free(str[i]); } return 0; }
#include <stdio.h> #include <string.h> //思路:二维数组 & 选择排序法 //将每个字符串看作一个具有大小的数,存入二位数组,采用冒泡/选择排序法实现a~z的排序 int main() { int n, i = 0, j; char dir[1001][101] = { 0 }, mid[101] = { 0 }; scanf("%d", &n); while (~scanf("%s", dir[i])) { i++; } for (i = 0; i <= n - 1; i++) { for (j = i + 1; j <= n - 1; j++) { if (strcmp(dir[i], dir[j]) <= 0) {//"比大小"的行为使用strcmp函数实现,应当注意条件(注意该函数的返回值) strcpy(mid, dir[i]); strcpy(dir[i], dir[j]); strcpy(dir[j], mid); } } } while (n) { printf("%s\n", dir[--n]); } return 0; }
#include <stdio.h> #include <string.h> int main() { char arr[1000][101]={}; int flag[1000]={}; int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",arr[i]); flag[i]=1; } char maxArr[101] ={'z'+1}; int minLoc=-1; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(strcmp(arr[j],maxArr)<0&&flag[j]){ strcpy(maxArr, arr[j]); minLoc=j; } } printf("%s\n",arr[minLoc]); flag[minLoc]=0; minLoc=-1; strcpy(maxArr, "{"); } return 0; }每次循环找到最小的值进行输出即可,几道相似的排序题分别使用不同的方式进行处理,还可以按照qsort进行处理,这样或许更快
int mycompare(void * a, void *b){ return (strcmp((char *)a,(char *)b)); //strcmp是字符串比较函数 } int main(void){ int i,n = 0; scanf("%d",&n); //获取数组的一维坐标大小范围 char input[n][101]; //对数组的一维坐标不要直接设定成1000,否则会报内存不足 for(i=0;i<n;i++){ scanf("%s",&input[i]); } qsort(input,n,sizeof(input[0]),mycompare); //直接调用stdlib.h的比较函数 for(i=0;i<n;i++){ printf("%s\n",input[i]); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> void hjfunction13() { int num; scanf("%d", &num); getchar(); char str[num][100]; //保存字符串 char *strp[num]; //保存排序后的指针 if (num >= 1) { scanf("%s",str[0]); // printf("输出%s\n", str[0]); *strp = str[0]; } for (int i = 1; i < num; i++) { scanf("%s",str[i]); for (int j = 0; j <= i-1; j++) //比较大小的循环 { if (strcmp(strp[j], str[i])!=-1) //找到了,比当前节点小,插入当前节点,计当前节点往后移动 { for (int k = i + 1; k > j; k--) //移动操作 { strp[k] = strp[k - 1]; } strp[j] = str[i]; break; } else if (j==i-1) //比最后一个大,直接最后面去 { strp[i]=str[i]; } else continue; } } for (int i = 0; i < num; i++) { printf("%s\n",strp[i]); } }; int main() { hjfunction13(); }
#include <stdio.h> int main() { int num; scanf("%d", &num); char str[num][101]; char tmp[101]; for(int i = 0; i < num; i++) scanf("%s", str[i]); for(int i = 0; i < num - 1; i++) { for(int j = i + 1; j < num; j++) { if(strcmp(str[i], str[j]) > 0) // 对比字符串大小进行排序 { strcpy(tmp, str[j]); strcpy(str[j], str[i]); strcpy(str[i], tmp); } } } for (int i = 0; i < num; i++) printf("%s\n", str[i]); }
#include<stdio.h> #include<stdlib.h> #include<string.h> int cmp_str(const void* e1, const void* e2) { return strcmp(*(char(*)[101])e1, *(char(*)[101])e2); } int main() { int n = 0; scanf("%d", &n); char str[1000][101] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf("%s", &str[i][0]); } qsort(str, n, sizeof(str[0]), cmp_str); for (i = 0; i < n; i++) { printf("%s\n", str[i]); } return 0; }