首页 > 试题广场 >

字符串排序

[编程题]字符串排序
  • 热度指数:521894 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围: ,字符串长度满足

输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。


输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
示例1

输入

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运行成功,提交到在线测试里面就不行了,有没有大佬看一下
编辑于 2024-04-25 13:24:33 回复(0)
#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]);
    }
}

发表于 2024-03-29 23:01:43 回复(0)
其实很简单  被我想复杂了

编辑于 2024-01-08 10:31:56 回复(0)
#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;
}

编辑于 2023-12-24 14:48:42 回复(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;
}

编辑于 2023-12-02 13:10:09 回复(0)
思路:
1.字符串存储,可使用字符指针数组+malloc存储
2.字符串排序,字典序,也就是因此字典排单词得规则,先按首字母大小排,相同则比较下一个字符,一次类推。也就是用strcmp比较大小即可。
3.多行字符串输入,考虑for+scanf接收
关键点:
    比较字符串时,进行大小替换过程中,因为这里使用指针数组+malloc形式,那么指针赋值,即改变指针指向即可。当然中间引入临时数组空间来中转,也是可以的,只是浪费空间。
注意思考:指针数组在排序后的指向情况。
#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;
}


发表于 2023-11-25 18:00:15 回复(0)
#include <stdio.h>
#include <string.h>
typedef struct {
    char buf[101];
} str;

int main() {
    str str[1001];
    char temp[101];
    int num, i, j, k, max = 0, len;
    scanf("%d", &num);
    for (i = 0; i < num; i++) {
        scanf("%s", str[i].buf);
        len = strlen(str[i].buf);
        if (len > max) {
            max = len;
        }
    }

    for (i = 0; i < num - 1; i++) {
        for (j = 0; j < num - 1; j++) {
            {
                k = 0;
                if (str[j].buf[k] != str[j + 1].buf[k]) {
                    if (str[j].buf[k] > str[j + 1].buf[k]) {
                        sprintf(temp, "%s", str[j + 1].buf);
                        sprintf(str[j + 1].buf, "%s", str[j].buf);
                        sprintf(str[j].buf, "%s", temp);
                    }
                } else {
                    while (k < strlen(str[i].buf)) {
                        k++;
                        if (str[j].buf[k] > str[j + 1].buf[k]) {
                            sprintf(temp, "%s", str[j + 1].buf);
                            sprintf(str[j + 1].buf, "%s", str[j].buf);
                            sprintf(str[j].buf, "%s", temp);
                            break;
                        } else {
                            if(str[j].buf[k] < str[j + 1].buf[k]){
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    for (i = 0; i < num; i++) {
        printf("%s\n", str[i].buf);
    }
    return 0;
}

发表于 2023-09-13 20:53:27 回复(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;
}

发表于 2023-03-31 15:59:43 回复(0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct DATA
{
    char S[200];
}data;
void swap(data *Arr,int lEN)
{
   for(int i = 0;i<lEN-1;i++)
   {
    for(int j = 0;j<lEN-i-1;j++)
    {
        if(strcmp(Arr[j].S,Arr[j+1].S)>0)
        {
            data temp = Arr[j+1];
            Arr[j+1] =Arr[j];
            Arr[j]  = temp;
        }
    }
   }
   return;
}
int main() {
    int len=0;
    scanf("%d",&len);
    data * Alldata=(data*)malloc(sizeof(data)*len);
    memset(Alldata, 0, sizeof(data)*len);
    for(int i = 0;i<len;i++)
    {
        char *str=(char*)malloc(sizeof(100));
        memset(str, 0, sizeof(100));
        scanf("%s",str);
        strcpy(Alldata[i].S,str);
    }
    swap(Alldata,len);
   
    for(int i = 0;i<len;i++)
    {
    printf("%s\n",Alldata[i].S);
    }
    return 0;
}
发表于 2023-02-13 14:20:17 回复(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进行处理,这样或许更快
发表于 2023-01-01 18:14:31 回复(0)
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;
    
}

发表于 2022-08-24 21:36:21 回复(0)
strcpy太费时间了,此方法把交换字符串优化为交换指针:
#include <stdio.h>
#include <string.h>
int main()
{
    int n;
    char  a[1000][101];
    char* b[1000];
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%s",&(a[i]));
        b[i]=&(a[i]);
    }
    for(int j=0;j<n-1;j++)
    {
        for(int k=j+1;k<n;k++)
        {
            char* p;
            if(strcmp(b[j],b[k])>0)
            {
                p=b[j];
                b[j]=b[k];
                b[k]=p;
            }
        

        }
    }
    for(i=0;i<n;i++)
    {
        printf("%s\n",b[i]);
    }
    return 0;
}

发表于 2022-07-18 22:49:39 回复(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();
}
不知道为神马本地运行结果和在线运行结果完全不一样
毁灭吧
先放代码  期望大佬能发现盲点

发表于 2022-07-05 11:33:10 回复(2)
参考评论区写的,没想到可以用strcmp接口处理,学习了
#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]);
}

发表于 2022-06-29 18:25:34 回复(0)
#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;
}

发表于 2022-06-21 20:26:28 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmpstr(void *a,void *b)
{
    char *str1 = *(char **)a;
    char *str2 = *(char **)b;
    return (strcmp(str1,str2));   
}

int main(void)
{
    int n;
    scanf("%d",&n);
    if(n < 1 || n > 1000) return -1;
    
    char *str[1000] ={NULL};
    int i = 0;
    for(i = 0; i < n; i++ )
    {
        str[i] = malloc(sizeof(char)*100);
        if(!str[i])
        {
            return -1;
        }
        scanf("%s",str[i]);
    }
    qsort(str, n, sizeof(str[0]), (__compar_fn_t) cmpstr);
/* 
    int j = 1;
    int tmp[101] ={'\0'};
    for(i = 0; i < n; i++)
    {
        for(j = i+1;j < n; j++)
        {
            if(strcmp(str[i], str[j]) > 0)
            {
                strcpy(tmp, str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],tmp);
            }
        }
    }
*/
    for(i = 0; i < n; i++)
    {
        printf("%s\n",str[i]);
    }
    
    return 0;
}
发表于 2022-06-16 14:56:06 回复(0)
大写排在小写前面?这就是字典排序吗?
发表于 2022-05-28 16:17:58 回复(1)