上一篇介绍了字符串的两种经典排序方法(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);
} } 

最新文章

  1. json 序列化为数组
  2. 面试中关于Java你所需知道的的一切
  3. UVA 1456 六 Cellular Network
  4. linux下解压命令大全(转载)
  5. vector &amp; array
  6. [Java]获取图片高和宽
  7. 如何在 Visual Studio 2012 控制 TFS 版控時要忽略哪些檔案
  8. MVC风格
  9. html5 canvas 圆形抽奖的实例
  10. Mathlab编程-微积分在Matlab中的解法
  11. CSS padding margin border属性详解【转载】
  12. Linux下并发网络设计之I/O复用
  13. Python常用排序算法
  14. bzoj1027 [HNOI2004]打鼹鼠
  15. Liunx小白须知
  16. 操作系统,时间片轮转算法的C语言实现Round Robin
  17. nodejs的express框架(request,response方法汇总)
  18. java学习——类之YuanZhu
  19. hdu 5019
  20. 【python】爬虫实践

热门文章

  1. vim基础命令,查找和替换
  2. 【转】python爬虫之腾讯视频vip下载
  3. Liunx软件安装之Tomcat
  4. unity之Layer作用
  5. 写博客没高质量配图?python爬虫教你绕过限制一键搜索下载图虫创意图片!
  6. JVM内存分配及String常用方法
  7. briup_jdbc自建工具类终极版
  8. java1.8新特性(一)接口的默认方法
  9. Python---网络爬虫初识
  10. CCPC-Wannafly Camp #2 (部分题解)