精华内容
下载资源
问答
  • 根据每一行的字符串长度进行排序,长度相同的根据字符串优先级进行排序
  • 方法一:用二维数组做函数参数; 方法二:用指向一维数组的指针做函数参数; 方法三:用string数组; 方法四:(即第12题)用指针数组做函数参数,字符串不等长。
  • 主要介绍了批处理命令教学之字符串排序:sort的相关资料,需要的朋友可以参考下
  • python字符串排序方法

    2020-12-24 14:06:54
    本文以实例形式简述了Python实现字符串排序的方法,是Python程序设计中一个非常实用的技巧。分享给大家供大家参考之用。具体方法如下: 一般情况下,python中对一个字符串排序相当麻烦: 一、python中的字符串类型是...
  • Java三种方法实现字符串排序

    千次阅读 2021-01-30 21:04:28
    文章目录Java字符串排序排序方法概述键索引计数法低位优先的字符串排序(LSD)高位优先的字符串排序(MSD)三向字符串快速排序 排序方法概述 对于许多应用,决定顺序的键都是字符串。本篇讲述如何利用字符串的特殊...

    Java字符串排序


    排序方法概述

    对于许多应用,决定顺序的键都是字符串。本篇讲述如何利用字符串的特殊性质来对其进行高效的排序。

    第一类方法会从右到左检查键中的字符。这种方法一般被称为低位优先Least-Significant-DigitFirstLSD)的字符串排序。如果将一个字符串看做一个256进制的数字,那么从右向左检查字符串就等价于先检查数字的最低位。这种方法最适合用于键的长度都相同的字符串排序应用。

    第二类方法会从左到右检查键中的字符,首先查看的是最高位的字符。这种方法通常称为高位优先MSD)的字符串排序。高位优先的字符串排序和快速排序类似,因为它们都会将需要排序的数组切分为独立的部分并递归地用相同的方法处理子数组来完成排序。它们的区别之处在于高位优先的字符串排序算法在切分时仅使用键的第一个字符,而快速排序的比较则会涉及键的全部。

    第三种方法是高位优先的字符串排序算法的改进快速排序,根据键的首字母进行三向切分,仅在中间子数组中的下一个字符(因为键的首字母都与切分字符相等)继续递归排序。

    键索引计数法

    作为热身,我们先学习一种适用于小整数键的简单排序方法。这种叫做键索引计数的方法本身就很实用,同时也是要学习的三种排序算法中前两种的基础。它其实就桶计数

    现在来情景引入,老师在统计学生的分数时可能会遇到以下数据处理问题。学生被分为若干组,标号为1、2、3、4等。在某些情况下,我们希望将全班同学按组分类。因为组的编号是较小的整数,使用键索引计数法来排序时很合适的。假设数组a[]中的每个元素都保存了一个名字和一个组号,其中组号在0到R-1之间,代码a[i].key()会返回指定学生的组号。四个步骤见代码

    int N = a.length;
    int R = 256;    //R为字符基数
    
    String[] aux = new String[N];
    int[] count = new int[R + 1];
    
    //计算出现频率
    for (int i = 0; i < N; i++) 
        count[a[i].key() + 1]++;
    
    //将频率转换为索引
    for (int r = 0; r < R; r++) 
        count[r + 1] += count[r];
    
    //将元素分类
    for (int i = 0; i < N; i++) 
        aux[count[a[i].key()]++] = a[i];
    
    //回写
    for (int i = 0; i < N; i++)
        a[i] = aux[i];
    

    命题A:键索引计数法排序N个键为0R-1之间的整数的元素需要访问数组11N+4R+1

    低位优先的字符串排序(LSD)

    如果字符串的长度均为W,那就从右向左以每个位置的字符作为键,用键索引计数法将字符串排序W遍。

    命题B:低位优先的字符串排序算法能够稳定地将定长字符串排序

    class LSD{
    	// Least-Significant-Digit First
    	//低位优先的字符串排序(基数排序)
    	public static void sort(String[] a, int W) {
    		//通过前W个字符将a[]排序
    		int N = a.length;
    		int R = 256;    //基数
    		String[] aux = new String[N];  //辅助数组\
    
    		for(int d = W - 1; d >= 0; d--) {
    			//根据第d个字符用键索引计数法排序
    			int[] count = new int[R + 1];   
    			//计算出现频率
    			for (int i = 0; i < N; i++)
    				count[a[i].charAt(d) + 1]++;
    			//将频率转换为索引
    			for (int r = 0; r < R; r++)
    				count[r + 1] += count[r];
    			//将元素分类
    			for (int i = 0; i < N; i++) 
    				aux[count[a[i].charAt(d)]++] = a[i];
    			//回写
    			for (int i = 0; i < N; i++) 
    				a[i] = aux[i];
    		}
    	}
    }
    

    在许多字符串排序的应用中,键的长度可能互不相同。改进后的低位优先的字符串排序是可以适应这些情况的。下来讲解两种处理变长键排序的算法

    高位优先的字符串排序(MSD)

    首先用键索引计数法将所有字符串按照首字母排序,然后(递归地)再将每个首字母所对应的子数组排序(忽略首字母,因为每一类中的所有首字母都是相同的)。和快速排序一样,高位优先的字符串排序会将数组切分为能够独立排序的子数组来完成排序任务,但它的切分会为每个首字母得到一个子数组,而不是像快速排序中那样产生固定的两个或者三个切分。

    在高位优先的字符串排序算法中,要特别注意到达字符串末尾的情况。在排序中,合理的做法是将所有字符都已被检查过的字符串所在的子数组排在所有子数组的前面,这样就不需要递归地将该子数组排序。为了简化这两步计算,我们使用了一个接受两个参数的私有方法charAt()来将字符串中字符索引转化为数组索引,当指定的位置超过了字符串末尾时该方法返回-1,。然后将所有返回值加1,得到一个非负的int值并用它作为count[]的索引。这种转换意味着字符串中的每个字符都可能产生R+1种不同的值:0表示字符串的结尾,1表示字符串的第一个字符,2表示字符串的第二个字符,等等。因为建索引计数法本来就需要一个额外的位置,所以使用代码int count[] = new int[R + 2]

    class MSD{
    	//高位优先的字符串排序
    	private static int R = 256;      //基数
    	private static final int M = 15; //小数组的切换阈值
    	private static String[] aux;     //数组分类的辅助数组
    	private static int charAt(String s, int d) {
    		if(d < s.length()) {
    			return s.charAt(d);
    		}else {
    			return -1;
    		}
    	}
    	public static void sort(String[] a) {
    		int N = a.length;
    		aux = new String[N];
    		sort(a, 0, N - 1, 0);
    	}
    	private static void sortInsert(String[] a, int lo, int hi) {
    		//小型数组进行插入排序
    		for (int i = lo + 1; i <= hi; i++) {
    			for(int j = i; j > lo && a[j].compareTo(a[j - 1]) < 0; j--) {
    				String tmp = a[j];
    				a[j] = a[j - 1];
    				a[j - 1] = tmp;
    			}
    		}
    	}
    	private static void sort(String[] a, int lo, int hi, int d) {
    		//以第d个字符为键将a[lo]至a[hi]排序
    		if(hi <= lo + M) {
    			sortInsert(a, lo, hi);
    			return; 
    		}
    		int [] count = new int[R + 2];    //计算频率
    		for(int i = lo; i <= hi; i++) {
    			count[charAt(a[i], d) + 2]++;
    		}
    		for(int r = 0; r < R + 1; r++) {  //将频率转换为索引
    			count[r + 1] += count[r];
    		}
    		for(int i = lo; i <= hi; i++) {   //数据分类
    			aux[count[charAt(a[i], d) + 1]++] = a[i];
    		}
    		for(int i = lo; i <= hi; i++) {   //回写
    			a[i] = aux[i - lo]; 
    		}
    		//递归的以每个字符为键进行排序
    		for(int r = 0; r <R; r++) {
    			sort(a, lo + count[r], lo + count[r + 1] - 1, d + 1);
    		}
    	}
    }
    

    三向字符串快速排序

    我们也可以根据高位优先的字符串排序算法改进快速排序,根据键的首字母进行三向切分,仅在中间子数组的下一个字符(因为键得出首字母都与切分字母相同)继续递归排序。这个算法的实现并不困难,参考往期排序算法中的三向切分快排即可。

    尽管排序的方式有所不同,但三向字符串快速排序根据的仍然是键的首字母并使用递归的方法将其余部分排序。对于字符串的排序,这个方法比普通的快速排序和高位优先的字符串排序更友好。实际上,它就是两种算法的结合。

    三向字符串快速排序只将数组切分为三部分,因此当相应的高位优先的字符串排序产生的非空切分较多时,它需要移动的数据量就会变大,因此它需要进行一系列的三向切分才能够取得多向切分的效果。但是,高位优先的字符串排序可能会创建大量(空)子数组,而三向字符串快速排序的切分总是只有三个。因此三向字符串快速排序能够很好地处理等值键、有较长公共前缀的键、取值范围较小的键和小数组-----所有高位优先的字符串排序算法不擅长的各种情况。

    class Quick3string{
    	//三向字符串快速排序
    	private static int charAt(String s, int d) {
    		if(d < s.length()) {
    			return s.charAt(d);
    		}
    		return -1;
    	}
        
    	public static void sort(String[] a) {
    		sort(a, 0, a.length - 1, 0);
    	}
        
    	private static void sort(String[] a, int lo, int hi, int d) {
    		if(hi <= lo) {
    			return;
    		}
    		int lt = lo, gt = hi, i = lo + 1;
    		int v = charAt(a[lo], d);
    		while(i <= gt) {
    			int t = charAt(a[i], d);
    			if(t < v) {
    				exch(a, lt++, i++);
    			}else if(t > v) {
    				exch(a, i, gt--);
    			}else {
    				i++;
    			}
    		}
    		//a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]
    		sort(a, lo, lt - 1, d);
    		if(v >= 0) {
    			sort(a, lt, gt, d + 1);
    		}
    		sort(a, gt + 1, hi, d);
    	}
        
    	private static void exch(String[] a, int i, int j) {
    		String t = new String(a[i]);
    		a[i] = a[j];
    		a[j] = t;
    	}
    }
    

    在将字符串数组a[]排序时,根据它们的首字母进行三向切分,然后(递归地)将得到的三个子数组排序:一个含有所以首字母小于切分字符的字符串子数组,一个含有所以首字母等于切分字符串的子数组(排序时忽略它们的首字母),一个含有所有首字母大于切分字符的字符串的子数组。


    参考资料:《算法》第四版

    展开全文
  • 字符串排序

    千次阅读 2020-06-17 00:41:40
    编写一个程序,将输入字符串中的字符按如下规则排序。 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 如,输入: Type 输出: epTy 规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。 如,输入: ...

     

    题目描述

    编写一个程序,将输入字符串中的字符按如下规则排序。

    规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

    如,输入: Type 输出: epTy

    规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

    如,输入: BabA 输出: aABb

    规则 3 :非英文字母的其它字符保持原来的位置。
     

    如,输入: By?e 输出: Be?y

     

    注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行)

    import java.util.*;
    public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            char temp;
            int right;
            while(sc.hasNext()){
                String s = sc.nextLine();
                char[] chars = s.toCharArray();
                for(int i=0;i<chars.length-1;i++){
                    for (int j=0;j<chars.length-1-i;j++){
                        if(!isAa(chars[j]))
                            continue;
                        right = j+1;
                        while (right < chars.length && !isAa(chars[right])){
                            right++;
                        }
                        if(right < chars.length && String.valueOf(chars[j]).compareToIgnoreCase(String.valueOf(chars[right]))>0){
                            temp = chars[j];
                            chars[j] = chars[right];
                            chars[right] = temp;
                        }
                    }
                }
                System.out.println(String.valueOf(chars));
            }
        }
        public static boolean isAa(char ch){
            if (ch>='a' && ch <='z')
                return true;
            if (ch>='A' && ch <='Z')
                return true;
            return false;
        }
    }

     

     

    展开全文
  • 字符串排序方法

    2012-08-03 10:33:09
    字符串排序方法 javaScript中的字符串排序
  • Java字符串排序比较。

    千次阅读 2019-09-06 15:47:14
    //Java 字符串如何排序比较 // 1、如果字符串相等返回值0 // 2、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串...
    public class Test {
     
    	public static void main(String[] args) {
    		//Java 字符串如何排序比较
    		// 1、如果字符串相等返回值0
    		// 2、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串)
    		// 3、如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度. 
    		String ss ="a10";
    		String ss2 = "a2";
    		System.out.println(ss.compareTo(ss2));
    	}
    }

     

    展开全文
  • 现有的排序算法很难实现自定义顺序的字符串排序,提出一种自定义顺序的字符串快速排序方法.在应用连续编号定义字符排序顺序的基础上,使用哈希表结构将字符串转换成对应的整型数组,以字符的最大编号作为基数排序算法的...
  • 如果要包含所有的字符似乎并不容易,我们先定义一个字符集, 待排序字符串中的所有字符都包含在这个字符集里 //字符集 private string _myCharSet = "0123456789qwertyuiopasdfghjklzxcvbnm"; 再来一个生成随机...
  • C语言字符串-字符串排序

    千次阅读 2020-12-23 19:05:26
    7-3字符串排序 (20分) 本题要求编写程序,读入5个字符串,按由小到大的顺序输出。 输入格式: 输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。 输出格式: 按照...

    7-3字符串排序 (20分)

    本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

    输入格式:

    输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

    输出格式:

    按照以下格式输出排序后的结果:

    After sorted:
    每行一个字符串

    输入样例:

    red yellow blue green white

    输出样例:

    After sorted:
    blue
    green
    red
    white
    yellow

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char str[5][100] = { 0 };
    	char tem[100];
    	for (int i = 0; i<5; i++)
    	{
    		scanf("%s", str[i]);
    	}
    	for (int i = 0; i<4; i++)
    	{
    		for (int j = 0; j<4 - i; j++)
    		{
    			if (strcmp(str[j], str[j + 1])>0)
    			{
    				strcpy(tem, str[j]);
    				strcpy(str[j], str[j + 1]);
    				strcpy(str[j + 1], tem);
    			}
    		}
    	}
    	printf("After sorted:\n");
    	for (int i = 0; i<5; i++)
    	{
    		printf("%s\n", str[i]);
    	}
    	return 0;
    }
    

    冒泡排序即可,不过不同的一点是,字符串交换要用strcpy和strcmp,想数一样用=是不匹配的

    展开全文
  • 字符串排序算法

    千次阅读 2019-05-05 11:42:45
    字符串排序算法总结比较 假定给定一个字符串数字,要求将该字符串数组排序。 规定字符串中的字符全集基数为R,即字符串中的每个字符都是字母表中某一个字符,其索引为[0,R)。 键索引计数法 假定给定的字符串...
  • java字符串排序

    千次阅读 2019-08-09 19:29:18
    java字符串排序 今天收到一个公司的面试邀请,人还没去,直接面试题都发过来了,真仗义啊。哈哈哈,我看了一下面试题,难度还是挺高的,怪不得直接给我。 我大致看了一下关于java方面的面试题,我还是对其中一个编程...
  • 如何在JavaScript中对字符串排序

    千次阅读 2020-06-29 11:07:35
    I have a list of objects I wish to sort based on a field attr of type string. 我有一个对象列表,希望根据字符串类型的字段
  • 基于c语言实现 字符串排序

    千次阅读 2020-04-23 19:34:15
    基于c语言实现 字符串排序一.简单的字符串排序举例实现题目代码 一.简单的字符串排序 给定有限个字符串,将其按照大小顺序排列。 此时的大小顺序简单来说我们可以先认为是ASCLL码的大小顺序。由此我们只需要比较字符...
  • oracle字符串排序

    千次阅读 2020-12-27 10:50:18
    oracle字符串排序oracle字符串排序oracle字符串数字部分排序 oracle字符串排序 select * from table order by to_number(id) oracle字符串数字部分排序 用正则 select * from table order by to_number(regexp_...
  • js实现字符串排序

    千次阅读 2021-03-06 11:44:56
    规则: 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 如,输入: Type 输出: epTy 规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。... //字符串切分为数组 let s=line.split("");
  • C语言编程之字符串排序

    千次阅读 2019-03-12 09:02:46
    问题描述:使用C语言编程实现对字符串排序。 程序源码: #include&lt;stdio.h&gt; void main() { char *str1[20],*str2[20],*str3[20]; char swap(); printf("please input three strings\n");...
  • 字符串排序问题(C)

    千次阅读 2020-11-17 17:02:10
    Description 输入三个字符串,按由小到大的顺序输出 .../*将字符串排序*/ #include<stdio.h> #include<string.h> //加入字符串头文件 int main(void) { char a[20],b[20],c[20],s[20]; g
  • sql字符串排序

    千次阅读 2019-04-19 15:55:40
    排序如下: SELECT * from detail p WHERE p.type = 3 ORDER BY substr(p.age, 1) asc; SELECT * from detail p WHERE p.type = 3 ORDER BY replace( p.age, 'M', '0') asc; SELECT * from detai...
  • 【分析】字符串排序程序设计

    千次阅读 2019-05-20 12:39:21
    字符串排序程序设计 编写一个字符串排序程序,对一个字符串中的数值进行从小到大的排序 例如字符串“36 9 78 29 -7 20” 要求变成 “ -7 9 20 29 36 78 ” 目录 字符串排序程序设计 编写一个字符串排序程序,...
  • 字符串排序————选择排序算法

    千次阅读 2020-02-25 15:43:15
    字符串排序————选择排序算法 我们来处理一个按字母表顺序排序字符串的问题,主要用strcmp()函数来确定两个字符串的顺序,代码如下: /* * @Author: Your name * @Date: 2020-02-24 14:35:13 * @Last Modified...
  • 字符串排序(C语言实现)

    万次阅读 多人点赞 2020-03-30 13:29:21
    习题8-7 字符串排序(C语言实现) 方法一:选择排序 #include <stdio.h> #include <string.h> void sort(char c[][81], int n) { int i,j,k; char t[81]; for(i=0; i<n-1; i++) { k=i; for(j...
  • Java实现字符串排序

    千次阅读 2020-06-09 01:31:44
    '为分隔符,将字符串分割 //取出字符串的第一个字符并使用选择排序进行排序处理 for (int i = 0; i ; i++) { for (int j = i + 1; j ; j++) { if (strArr[i].charAt(0) > strArr[j].charAt(0)) { String tempStr = ...
  • C语言多个字符串排序

    千次阅读 2020-05-19 10:31:06
    C语言中,多个字符串排序方法有两种 1,字符二维数组排序 void sort1(char (*arr)[20]){ int i,j; char *temp; //冒泡排序 for(i=0;i<4;i++){ for(j=0;j<4-i;j++){ if(strcmp(arr[j],arr[j+1])&...
  • Python编程PTA题解——字符串排序

    千次阅读 2020-03-21 14:56:30
    Description:读入5个字符串,按由小到大的顺序输出。 Input:输入仅一行,输入由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。 Output: 按照以下格式输出排序后的结果...
  • C++实现字符串排序

    千次阅读 2020-08-14 19:35:50
    #include<iostream> #include<string> #include<vector> #include<ctype.h> #include<algorithm> using namespace std; bool charSort(char&... return ch1&g.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 664,957
精华内容 265,982
关键字:

字符串排序