首页 > 试题广场 >

字符串排序

[编程题]字符串排序
  • 热度指数:515360 时间限制: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
可以用插入排序,也可以用vectorSTL的sort函数
#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main(){
	int n;
	while (cin>>n){
		if (!n)
			continue;
		vector<string> v;
		for (int i = 0; i<n; ++i){
			string temp;
			cin >> temp;
			int j = 0;
			for (; j < i && temp >= v[j]; ++j);
			v.insert(v.begin() + j, temp);
		}

		for (int i = 0; i < v.size(); ++i){
			cout << v[i] << endl;
		}
	}
	return 0;
}

发表于 2016-06-17 07:15:21 回复(0)
let num = readline()
const arr = []
while(line = readline()){
    arr.push(line)
}
arr.sort()
arr.forEach(item=>{
    console.log(item)
})


发表于 2022-06-13 21:01:12 回复(0)
排序
#include<stdio.h>
#include<string.h>

//排序
void sort(int n, char str[1001][101]) {
    int flag = 0; //排序结束标志位
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            char move[101];
            if (strcmp(str[j], str[j + 1]) > 0) {
                strcpy(move, str[j]);
                strcpy(str[j], str[j + 1]);
                strcpy(str[j + 1], move);
                flag = 1;
            }
        } if (flag = 0) break;
    }
}

int main() {
    char str[1001][101] = {'\0'};
    int n;
    while (~scanf("%d", &n)) {
        for (int i = 0; i < n; i++) {
            scanf("%s", str[i]); // printf("%s\n",str[i]);
        }
        sort(n, str);
        for (int j = 0; j < n; j++)
            printf("%s\n", str[j]);
    }
}


发表于 2022-04-02 16:09:13 回复(0)
import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner sr=new Scanner(System.in);
        while(sr.hasNext())
        {
            //int n=Integer.parseInt(sr.nextLine());
            int n=sr.nextInt();
            //使用这种输入编译会报数组越界错误,用上面方法输入就能编译通过,这是为什么啊?
            String[] str=new String[n];
            for(int i=0;i<n;i++)
                str[i]=sr.nextLine();
            Arrays.sort(str);
            for(int i=0;i<n;i++)
                System.out.println(str[i]);
        }
    }
}

发表于 2022-02-15 21:26:50 回复(3)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Integer row = Integer.valueOf(scan.nextLine());
        List<String> codes = new ArrayList<>();
        for (int i=0;i<row;i++) {
            String code = scan.nextLine();
            if (code.trim().matches("[A-Za-z]+")) {
                codes.add(code);
            }
        }
        codes.stream().sorted().forEach(System.out::println);
    }
}
发表于 2021-12-17 13:59:12 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        ArrayList<String> strings = new ArrayList<>();
        while (in.hasNext()) {
            int a = Integer.parseInt(in.nextLine());
            for(int i=0;i<a;i++){
                String b = in.nextLine();
                    strings.add(b);
            }
            Collections.sort(strings);
            strings.forEach((k)->System.out.println(k));
        }
    }
}
发表于 2021-10-14 13:38:39 回复(0)
# -*- coding: utf-8 -*-
# @Time : 2021/9/18 22:28
# @Author : zhaow
# @Email : 401407793@qq.com
# @File : HJ14 字符串排序.py
# @Project : PyCharm Project

if __name__ == '__main__':
    count = int(input(''))
    # 方法一
    # resa = [input('') for w in range(count)]
    # resa.sort()
    # res = sorted(resa)
    # ----------------------------------------

    # 方法二
    # res = sorted([input('') for w in range(count)])
    # ----------------------------------------

    # 方法三
    res = []
    for w in range(count):
        res.append(input())
        # res.sort()
    # ----------------------------------------

    # for r in res:
    #     print(r)

    for r in sorted(res):
        print(r)

发表于 2021-09-18 22:43:29 回复(0)
题目中给出的字符个数对Java来说没啥太大作用,我用到了Collections工具类中的sort()方法,它会将数字放在前面,非数字的元素会按照字典顺序进行排序,首字符相同则比较第二个字符,以此类推
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> in = new ArrayList<String>();
        while(scanner.hasNext()){
            in.add(scanner.nextLine());
        }
        Collections.sort(in);
        for (int i = 1; i < in.size(); i++){
            System.out.println(in.get(i));
        }
    }
}


发表于 2021-08-04 21:24:57 回复(0)
直接输入+自定义sort排序+字符串比较”<"
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    string tmp;
    string str;
   
    int n;
    cin>>n;
    vector<string>res(n);
    res.clear();
    while(cin>>tmp)
        res.emplace_back(tmp);
    sort(res.begin(),res.end(),[](string &a,string &b){
        return a<b;
    });
    for(int i=0;i<n;++i){
        cout<<res[i]<<endl;
    }
    return 0;
}


发表于 2021-07-25 10:08:45 回复(0)
利用map的性质,代码简洁
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n; cin >> n;
    string s;
    map<string, int> map;
    for (int i = 0; i < n; i++) {
        cin >> s;
        map[s] += 1;
    }
    for (auto i : map) {
        for (int k = 0; k < i.second; k++) {
            cout << i.first << endl;
        }
    }
    return 0;
}


发表于 2021-06-19 23:02:38 回复(0)
看了前面用c++写的大佬,突然感觉python太香了
def rankarr(list):
    list.sort()
    for item in list:
        print(item)
arr = []
num = input()
for i in range(int(num)):
    arr.append(input())
rankarr(arr)


发表于 2021-05-19 16:26:25 回复(0)
一堆人直接调用sort函数有个屁用
本质就是用快速排序,然后用比较字符串函数替换掉比较数字大小的部分
lists = []

def cmp(s1, s2):
    l = len(s2)
    if s1 == s2:
        return True
    for i, c1 in enumerate(s1):
        if i >= l:
            return 1
        c2 = s2[i]
        if c1 != c2:
            return ord(c1) - ord(c2)
    return len(s1) - len(s2)

def fun2(s1, s2):
    l = len(s2)
    if s1 == s2:
        return True
    for i, c1 in enumerate(s1):
        if i >= l:
            return False
        c2 = s2[i]
        if c1 > c2:
            return False
        elif c1 < c2:
            return True
    return False

def quick_sort(i, j):
    if i >= j:
        return lists
    low, high = i, j
    p = lists[i]
    while i<j:
        while i < j and cmp(lists[j], p) >= 0:
            j -= 1
        lists[i] = lists[j]
        while i < j and cmp(lists[i], p) <= 0:
            i += 1
        lists[j] = lists[i]
    lists[i] = p
    quick_sort(low, i-1)
    quick_sort(i+1, high)


while True:
    try:
        n = int(input())
        lists = []
        for i in range(n):
            lists.append(input())
        quick_sort(0, len(lists) - 1)
        for s in lists:
            print(s)
    except EOFError:
        break


发表于 2021-03-12 00:48:44 回复(0)

不用直接交换字符串,可以设置一个指针数组指向每一个串的首地址,然后对这个指针数组进行排序即可。使用快速排序算法:

#include <stdio.h>
#include <string.h>

char ss[1000][101];
char* ps[1000];

void swap(int i, int j)
{
    char* tmp = ps[i];
    ps[i] = ps[j];
    ps[j] = tmp;
}

int partition(int p, int r)
{
    char* pivot = ps[r];
    int i = p - 1, j;

    for (j = p; j <= r - 1; ++j) {
        if (strcmp(ps[j], pivot) <= 0) {
            ++i;
            if (i != j) swap(i, j);
        }
    }

    swap(i + 1, j);

    return i + 1;
}

void qsort(int p, int r)
{
    if (p >= r) return;

    int q = partition(p, r);

    qsort(p, q - 1);
    qsort(q + 1, r);
}

int main()
{
    int n;

    scanf("%d", &n);

    for (int i = 0; i < n; ++i) {
        scanf("%s", ss[i]);
        ps[i] = ss[i];
    }

    qsort(0, n - 1);

    for (int i = 0; i < n; ++i) printf("%s\n", ps[i]);

    return 0;
}
发表于 2021-02-24 22:32:38 回复(0)
n=int(input())
s=[]
for i in range(n):
    s+=[input()]
s2=sorted(s)
for i in s2:
    print(i)
读完之后用内置的sorted函数排序一下,然后遍历输出
发表于 2020-12-26 23:15:17 回复(0)

输入保存到列表,排序好,按行输出

使用列表生成式
n = int(input())
str_list = [input() for i in range(n)]
for i in sorted(str_list):
    print(i)


发表于 2020-10-04 15:58:13 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            int n = sc.nextInt();
            List<String> list = new ArrayList<String>();
            for(int i=0; i<n; i++) {
                String str = sc.next();
                list.add(str);
            }
            // 按字符串升序排序
            list.sort(new Comparator<String>() {
                @Override
                public int compare(String str1, String str2) {
                    // TODO Auto-generated method stub
                    return str1.compareTo(str2);
                }
            });
            //用这个也可以
            // Collections.sort(list);
            
            for (String s : list) {
                System.out.println(s);
            }
        }
    }
}
发表于 2020-09-19 00:40:16 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;
int main()
{
    int n;
    string s;
    vector<string> v;
    cin >> n;
    while(n-- && cin >> s)
        v.push_back(s);
    sort(v.begin(), v.end());
    for(auto it=v.begin();it!=v.end();it++)
        cout<< *it << endl;
    return 0;
}
我承认不应该用泛型算法,但是sort()函数真香!
发表于 2020-09-16 15:50:25 回复(0)

纯C

快排
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define N_STRS 1000
#define STR_LEN 100

void str_quick_sort(char str[N_STRS][STR_LEN], int low, int high)
{
    char *temp = (char *)malloc(sizeof(char) * STR_LEN);
    int i=low, j=high;
    if(low < high)
    {
        strcpy(temp, str[low]);
        while(i != j)
        {
            while(j>i && strcmp(str[j], temp)>0) --j;
            if(i<j)
            {
                strcpy(str[i],str[j]);
                ++i;
            }
            while(i<j && strcmp(str[i], temp)<0) ++i;
            if(i<j)
            {
                
                strcpy(str[j],str[i]);
                --j;
            }
        }
        strcpy(str[i],temp);
        str_quick_sort(str, low, i-1);
        str_quick_sort(str, i+1, high);
    }
}

int main()
{
    char str[N_STRS][STR_LEN] = {'\0'};
    int n;
    scanf("%d\n", &n);
    for(int i=0; i<n; i++)
    {
        scanf("%s\n", str[i]);
    }
    str_quick_sort(str, 0, n-1);
    for(int i=0; i<n; i++)
    {
        printf("%s\n", str[i]);
    }
    return 0;
}


编辑于 2020-08-24 11:35:35 回复(0)
import sys
n = int(sys.stdin.readline().strip())
a, result = [], []
for i in range(n):
    a.append(sys.stdin.readline().strip())
for n1 in range(n,1,-1):
    for i in range(n1-1):
        j = 1
        pos1, pos2 = ord(a[i][0]), ord(a[i+1][0])
        while pos1 == pos2 and j<min(len(a[i]),len(a[i+1])):
            pos1, pos2 = ord(a[i][j]), ord(a[i+1][j])
            j += 1
        if pos1 == pos2:
            pos1, pos2 = len(a[i]), len(a[i+1])
        if pos1 > pos2:
            a[i:i+2] = [a[i+1],a[i]]
for i in range(n):
    print(a[i])
用C的思路写的python,然而实际python一个函数就能搞定
发表于 2020-08-21 16:12:20 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        List<String> result = new ArrayList<>();
        for (int i = 0; i < num; i++){
            result.add(scanner.next());
        }
        Collections.sort(result);
        for (int j = 0; j < result.size(); j++){
            System.out.println(result.get(j));
        }
    }
}

发表于 2020-08-18 18:32:01 回复(0)