5.1 字符串排序

本节我们将学习两类完全不同的字符串排序方法。

第一种方法会从右到左检查键中的字符。这种方法一般被称为低位优先(Least-Significant-Digit First,LSD)的字符串排序。使用数字(digit)代替字符(character)的原因要追溯到相同方法在各种数字类型中的应用。如果将一个字符串看作一个256进制的数字,那么从右向左检查字符串就等价于先检查数字的最低位。这种方法最适合用于键的长度都相同的字符串排序应用。

第二种方法会从左到右检查键中的字符,首先查看的是最高位的字符。这些方法通常称为高位优先(MSD)的字符串排序——本节将会学习两种此类算法。高位优先的字符串排序的吸引人之处在于,它们不一定需要检查所有的输入就能够完成排序。

高位优先的字符串排序和快速排序类似,因为它们都会将需要排序的数组切分为独立的部分并递归地用相同的方法处理子数组来完成排序。它们的区别之处在于高位优先的字符串排序算法在切分时仅使用键的第一个字符,而快速排序的比较则会涉及键的全部。要学习的第一种方法会为每个字符创建一个切分,第二种方法则总会产生三个切分,分别对应被搜索键的第一个字符小于、等于或大于切分键的第一个字符的情况。在分析字符串排序算法时,字母表的大小是一个重要的因素。尽管我们的重点是基于扩展的ASCII字符集的字符串(R=256),但也会分析来自较小字母表的字符串和来自较大字母表的字符串。

5.1.1 键索引计数法

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

5.1.2 低位优先的字符串排序

我们学习的第一个字符串排序算法叫做低位优先(LSD)的字符串排序。考虑以下应用:假设有一位工程师架设了一个设备来记录给定时间段内某条忙碌的高速公路上所有车辆的车牌号,他希望知道总共有多少辆不同的车辆经过了这段高速公路。

输入 排序结果
4PGC938 1ICK750
2IYE230 1ICK750
3CI0720 10HV845
1ICK750 10HV845
10HV845 10HV845
4JZY524 2IYE230
1ICK750 2RLA629
3CI0720 2RLA629
10HV845 3ATW723
10HV845 3CI0720
2RLA629 3CI0720
2RLA629 4JZY524
3ATW723 4PGC938

图5.1.2 适于使用低位优先的字符串排序算法的典型情况

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

int N = a.length;
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[].key()为[0,R)之间的一个整数)

算法5.1 低位优先的字符串排序

public class LSD
{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];}}}

要将每个元素均为含有W个字符的字符串数组a[]排序:从右向左,以每个位置的字符为键排序一次。

算法(五)——字符串排序相关推荐

  1. Python算法--杂乱字符串排序

    题目 编写一个程序,将输入字符串中的字符按如下规则排序. 规则 1 :英文字母从 A 到 Z 排列,不区分大小写. 如,输入: Type 输出: epTy 规则 2 :同一个英文字母的大小写同时存在时 ...

  2. 字符串排序-C语言实例

    1.简单的字符串排序 给定有限个字符串,将其按照大小顺序排列.此时的大小顺序简单来说我们可以先认为是ASCLL码的大小顺序.由此我们只需要比较字符串的ASCLL码的大小即可. 2.算法设计 1.输入1 ...

  3. python【蓝桥杯vip练习题库】ALGO-234第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输 ...

  4. c++Numerical string sort数字字符串排序的实现算法(附完整源码)

    C++Numerical string sort数字字符串排序的实现算法 C++Numerical string sort数字字符串排序的实现算法完整源码(定义,实现,main函数测试) C++Num ...

  5. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

  6. php自然排序法的比较过程,PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)...

    本文实例讲述了PHP中strnatcmp()函数"自然排序算法"进行字符串比较用法.分享给大家供大家参考,具体如下: PHP中strnatcmp()函数使用"自然&quo ...

  7. 程序员的算法课(10)-字符串排序算法实例(纯代码)

    一.低位优先(Least-Signifcant-Digit First,LSD) 字符串的低位优先排序算法目的就是将一组字符串按照从右到左的顺序依次比较指定索引位置的字符大小并排序.根据上述字符串的分 ...

  8. 按照拼音对数组中的中文字符串排序的算法

    按照拼音对数组中的中文字符串排序的算法,不是很难,这里直接放上代码,Demo去最下面找: 注:里面用到一个叫George的牛人写的中文转拼音首字母的函数pinyinFirstLetter,因为内容实在 ...

  9. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

最新文章

  1. Java8新特性:接口的默认方法与接口的静态方法
  2. cd linux menu.lst,用ultraiso制作cdlinux的U盘启动盘
  3. Windows PowerShell:Windows PowerShell的简介、入门、使用方法之详细攻略
  4. 7z压缩文档的powershell示例
  5. 前端性能优化之性能测试
  6. 向服务器上传文件的命令,上传文件到远程服务器的命令
  7. node.js服务器+mongodb数据库(重拾)
  8. 海淀区第九届单片机竞赛获奖名单_第十二届程序设计竞赛暨ACM选拔赛获奖名单...
  9. 点4下还是点1下?使用jQuery启动一个SharePoint工作流
  10. 使用插件扩展Docker
  11. N!阶层的二进制表示中最低位1的位置
  12. 这可能不只是一篇面经(BAT面试)
  13. 元素周期表排列的规律_元素周期表的排列有什么规律?
  14. Android应用的persistent属性
  15. 巢湖学院对口高考成绩查询入口2021,巢湖学院
  16. 软件项目接单渠道丨软件公司项目接单平台
  17. C++核心准则边译边学-I.27 考虑使用指向实现的指针技术获得稳定的ABI
  18. 如何用c语言编程逻辑运算符,c语言逻辑运算符的优先级是怎样的
  19. 第45期:动态规划-背包问题
  20. 号称下一代消息中间件!来看看它有多牛逼

热门文章

  1. 次世代游戏建模技巧全解
  2. 升级linux4.9 故障,CentOS 4升级到4.9
  3. 怎么永久关闭linux防火墙
  4. 微型计算机储存最快的是什么车,谁是《极品飞车14》的佳前挡?
  5. SAP 标准价与移动平均价的区别和作用
  6. 案例总结,用户体系6个难点 |如何落地,利用数据、函数模型用户成长体系
  7. Exploring the Capacity of Sequential-free Box Discretization Network for Omnidirectional Scene Text
  8. LibGDX制作android动态壁纸
  9. Python 把十进制转换为二进制(或八进制、十六进制)
  10. Android 10 HAL 层添加HIDL实现过程