上一篇介绍了字符串的两种经典排序方法(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. c语言的输出

    Cpp是c plus plus Cpp c++的源文件 c++支持c语言的语法 %x是十六进制x后面输出小写%X输出的结果是大写. %o是八进制. %lf是双精度double,默认小数点后六位,输出最 ...

  2. app发布当天,用户无法登录

    原因:当用户登录时候有商城用户的触发器存在,它会让商城用户也更新成登录状态. 由于用户量大,导致数据库锁死. 最后解决案:删掉触发器,在app的接口登录程序里,追加商城用户更新成登录的操作. 他案1: ...

  3. unity_UGUI养成之路02

    1.技能的冷确效果 2.背包的分页效果 1创建背包的总面板,并添加ToggleGroup组件 2.物品面板的实现 3.背包分页的实现 注意:添加了Toggle组件的游戏对象不能再添加button组件. ...

  4. Jenkins教程——从安装到部署Docker服务(二)声明式流水线HelloWorld

    前言 本文通过一个声明式流水线的HelloWorld程序做一下流水线基础入门,对常用的流水线参数进行简要说明 什么是流水线 现实中的流水线 流水线比较好理解,类比于现实生活中的生产流水线,每个流程只做 ...

  5. 关于简单递归在python3中的实现

    话不多说,奉上代码: #倒计时 def count_down(i): if i <= 0: return else: print(str(i)) count_down(i - 1) #求阶乘 d ...

  6. 一张图了解.Net Core和.NetFx和.Net Standard和Xamarin关系

    一张图了解 .Net Core和.Net Framework和.Net Standard和Xamarin关系 总结 .NET Standard是一项API规范,每一个特定的版本,都定义了必须实现的基类 ...

  7. 舍得 (学习html几天)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Codeforces Round #486 (Div. 3)988D. Points and Powers of Two

    传送门:http://codeforces.com/contest/988/problem/D 题意: 在一堆数字中,找出尽量多的数字,使得这些数字的差都是2的指数次. 思路: 可以知道最多有三个,差 ...

  9. Codeforces Round #480 (Div. 2) B. Marlin

    题目地址:http://codeforces.com/contest/980/problem/B 官方题解: 题意: 有一个城市有4行n列,n是奇数,有一个村庄在(1,1),村民在(4,n)钓鱼:还有 ...

  10. Codeforces 734D. Anton and Chess(模拟)

    Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...