上一篇介绍了字符串的两种经典排序方法(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)的更多相关文章

  1. [c/c++] programming之路(22)、字符串(三)——字符串封装

    项目结构 头文件.h #include<stdio.h> #include<stdlib.h> #include<string.h> //字符串封装,需要库函数 / ...

  2. python--基础学习(三)字符串单引号、双引号、三引号

    1.基本认识 单引号字符串:'python' 双引号字符串:"python" 三引号字符串:'''python'''(三单引号),"""python& ...

  3. ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)

    1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 471  Solved: 188[Submit][Sta ...

  4. iOS开发Swift篇—(三)字符串和数据类型

    iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http://www ...

  5. [Python学习] 模块三.基本字符串

            于Python最重要的数据类型包含字符串.名单.元组和字典.本文重点介绍Python基础知识. 一.字符串基础         字符串指一有序的字符序列集合,用单引號.双引號.三重(单 ...

  6. JAVA中用于处理字符串的“三兄弟”

    JAVA中用于处理字符串常用的有三个类:java.lang.String.java.lang.StringBuffer.java.lang.StringBuilder,这三者的共同之处都是final类 ...

  7. 彻底了解构建 JSON 字符串的三种方式

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...

  8. JS中三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来 ...

  9. python列表和字符串的三种逆序遍历方式

    python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...

随机推荐

  1. python(自用手册)三

    第三章 基础 3.1编码初识 ascii 256字母没有中文 一个字节 8位 gbk 中国 中文2字节 16位 英文1字节8位 unicode 万国码 前期 2字节 8位 后期变成4个字节 32位 u ...

  2. Mybatis中使用PageHelper插件进行分页

    分页的场景比较常见,下面主要介绍一下使用PageHelper插件进行分页操作: 一.概述: PageHelper支持对mybatis进行分页操作,项目在github地址: https://github ...

  3. zookeeper和dubbo安装与搭建

    Zookeeper+Dubbo安装与搭建 (原创:黑小子-余) 本文有借鉴:https://www.cnblogs.com/UncleYong/p/10737119.html (一)zookeeper ...

  4. Joda Time使用小结

    一.Joda Time基础操作 1. 构造指定时间 // 明确给出年月日时分秒,同时还可以指定毫秒 DateTime dateTime = new DateTime(2017,9,14,20,30,0 ...

  5. native-echarts 问题总结

    一.当width 和 height 设置的不对的时候,会出现边框线如图所示: 解决办法:Echarts/index.js文件中 <WebView ref="chart" sc ...

  6. 【阿里云IoT+YF3300】4.Alink物模型之事件触发

    名词解释:设备的功能模型之一,设备运行时的事件,事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数.如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送. 在工控 ...

  7. vue结合element-ui做简单版todolist

    结合element-ui首先需要npm安装element-ui npm i element-ui -S: 然后在入口文件中引入: import ElementUI from 'element-ui'; ...

  8. Flink 源码解析 —— TaskManager 处理 SubmitJob 的过程

    TaskManager 处理 SubmitJob 的过程 https://t.zsxq.com/eu7mQZj 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink ...

  9. HDU - 1392 Surround the Trees (凸包)

    Surround the Trees:http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意: 在给定点中找到凸包,计算这个凸包的周长. 思路: 这道题找出 ...

  10. Codeforces 374 C Inna and Dima (DFS)

    Inna and Dima 题意:从图上的任意一个D点按着DIMADIMA的顺序走,问一共可以经过多少个DIMA,如果经过0个DIMA就输出“Pool DIma!“,如果可以有无数多个DIMA就输出” ...