字符串之————三向字符串快速排序(Quick3string)
上一篇介绍了字符串的两种经典排序方法(LSD MSD): https://www.cnblogs.com/Unicron/p/11531111.html
在三向字符串快速排序中我们只需要改进一下快速排序的代码就能实现它,它特别适用于较长的含有公共前缀的字符串,并且不需要任何额外空间。代码比较简单,主要是理解它的思想。
一、核心思想
利用的分治的思想,通过中间字符串每次将字符串数组划分为三个小组。
再递归地对小组进行同样的处理,直到走到字符串末尾,最后形成的字符串数组自然有序。
二、具体做法:
1、用一个字符作为中间字符(本篇文章中默认选择字符串的第一个字符),比它大的移到字符串数组末尾,比它小的移到它前面。
这样遍历玩一遍后会形成三个小组,里面的字符串开头字母分别为,小于中间字符,等于中间字符,大于中间字符。
(需要注意的是,这里字符串的移动借助exch()方法,直接在字符串数组上进行字符串位置交换,而不需要借助额外的数组)
2、对分类的三个字符串数组逐一进行步骤1直到字符串中的字符全部遍历。最后形成的字符串自然有序。
三、实例演示
按照上面的步骤,我们来来对一个实例进行完整处理:

四、与LSD、MSD的对比
LSD中没有分组的概念,单纯从右到左对每个字符排序。
MSD加入了分组的概念,但对于每个分组也是从头到尾,由于每次排序都要创建辅助数组,在数组较长时将会用到很大的空间。
quick3string与两者不同的是不用额外申请空间,且对于存在大量相同前缀的字符串数组,它也能很好得处理。
五、完整代码
public class Quick3string {
private static int charAt(String s,int d){
if(d<s.length()){
return s.charAt(d);
}else{
return -1;
}
}
private static void exch(String [] s,int a,int b){
String temp=s[a];
s[a]=s[b];
s[b]=temp;
}
public static void sort(String[] a){
sort(a,0,a.length-1,0);
}
public static void sort(String[] a,int lo,int hi,int d){
if(hi<=lo){
return;
}
int lt=lo,gt=hi;
int v=charAt(a[lo],d);
int i=lo+1;
while(i<=hi){
int t=charAt(a[i],d);
if (t<v){
exch(a,lt++,i++);
}
else if (t>v){
exch(a,gt--,i);
}else {
i++;
}
}
sort(a,lo,lt-1,d);
if (v>=0){
sort(a,lt,gt,d+1);
}
sort(a,gt+1,hi,d);
}
}
字符串之————三向字符串快速排序(Quick3string)的更多相关文章
- [c/c++] programming之路(22)、字符串(三)——字符串封装
项目结构 头文件.h #include<stdio.h> #include<stdlib.h> #include<string.h> //字符串封装,需要库函数 / ...
- python--基础学习(三)字符串单引号、双引号、三引号
1.基本认识 单引号字符串:'python' 双引号字符串:"python" 三引号字符串:'''python'''(三单引号),"""python& ...
- ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)
1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 471 Solved: 188[Submit][Sta ...
- iOS开发Swift篇—(三)字符串和数据类型
iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http://www ...
- [Python学习] 模块三.基本字符串
于Python最重要的数据类型包含字符串.名单.元组和字典.本文重点介绍Python基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...
- JAVA中用于处理字符串的“三兄弟”
JAVA中用于处理字符串常用的有三个类:java.lang.String.java.lang.StringBuffer.java.lang.StringBuilder,这三者的共同之处都是final类 ...
- 彻底了解构建 JSON 字符串的三种方式
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...
- JS中三种字符串连接方式及其性能比较
工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法 用连接符“+”把要连接的字符串连起来 ...
- python列表和字符串的三种逆序遍历方式
python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...
随机推荐
- mssql server master 数据库还原
今天想试一下master数据库还原,在进入单用户模式的时候,在命令行输入sqlserver.exe -c -f -m结果显示 'sqlserver.exe' 不是内部或外部命令,也不是可运行的程序或批 ...
- 开发者工具conloseLog的使用
- 自己搭建传统ocr识别项目学习
大批生成文集训练集: https://www.cnblogs.com/skyfsm/p/8436820.html 基于深度学习的文字识别(3755个汉字) http://www.cnblogs.com ...
- 完结撒花!129 集 21 个小时,松哥自制的 Spring Boot2 系列视频教程杀青啦!
松哥的 Spring Boot 教程分为几个阶段. 2016 松哥最早在 2016 年底的时候开始写 Spring Boot 系列的教程,记得当时在广州上班,年底那段时间在深圳出差,在深圳人生地不熟, ...
- 80后,天才程序员, Facebook 第一任 CTO,看看开挂的人生到底有多变态?
鸡仔说:今天介绍一位天才程序员--亚当·德安格洛(Adam D'Angelo),他被<财富>杂志誉为"科技界最聪明的人之一",大学去了被誉为"天才" ...
- 单选多选(CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 1.前沿 首先来说说我们的需求吧:随机出现单选题或者多选题,完全回答正确才算正确(多选题中少选错选算错),核实答案的 ...
- unity编辑器扩展_01(在工具栏中创建一个按钮)
代码: [MenuItem("Tools/Test",false,1)] static void Test() { Debug.Log("tes ...
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...
- (七)分布式通信----Netty实现NIO通信
目录 1. 消息监听器 2. 指令执行器 3. 消息发送器 4. 客户端工厂 5. 序列化工具 6. 通信主机 项目文件结构图 通信主机: 1. 消息监听器(黄色框) 这部分由 Netty 实现,Ne ...
- String类中intern方法的原理分析
一,前言 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今 ...