字符串之————三向字符串快速排序(Quick3string)

上一篇介紹了字符串的兩種經典排序方法(LSD MSD): http://www.javashuo.com/article/p-wnbaouqp-by.htmlhtml

 

在三向字符串快速排序中咱們只須要改進一下快速排序的代碼就能實現它,它特別適用於較長的含有公共前綴的字符串,而且不須要任何額外空間。代碼比較簡單,主要是理解它的思想。數組

 

1、核心思想

利用的分治的思想,經過中間字符串每次將字符串數組劃分爲三個小組。ui

再遞歸地對小組進行一樣的處理,直到走到字符串末尾,最後造成的字符串數組天然有序。spa

 

2、具體作法:

一、用一個字符做爲中間字符(本篇文章中默認選擇字符串的第一個字符),比它大的移到字符串數組末尾,比它小的移到它前面。code

這樣遍歷玩一遍後會造成三個小組,裏面的字符串開頭字母分別爲,小於中間字符,等於中間字符,大於中間字符。htm

(須要注意的是,這裏字符串的移動藉助exch()方法,直接在字符串數組上進行字符串位置交換,而不須要藉助額外的數組) blog

二、對分類的三個字符串數組逐一進行步驟1直到字符串中的字符所有遍歷。最後造成的字符串天然有序。排序

 

3、實例演示

按照上面的步驟,咱們來來對一個實例進行完整處理:遞歸

 

 

4、與LSD、MSD的對比

LSD中沒有分組的概念,單純從右到左對每一個字符排序。字符串

MSD加入了分組的概念,但對於每一個分組也是從頭至尾,因爲每次排序都要建立輔助數組,在數組較長時將會用到很大的空間。

quick3string與二者不一樣的是不用額外申請空間,且對於存在大量相同前綴的字符串數組,它也能很好得處理。 

 

5、完整代碼

 1 public class Quick3string {
 2     private static int charAt(String s,int d){
 3         if(d<s.length()){
 4             return  s.charAt(d);
 5         }else{
 6             return -1;
 7         }
 8     }
 9 
10     private  static void exch(String [] s,int a,int b){
11         String temp=s[a];
12         s[a]=s[b];
13         s[b]=temp;
14     }
15 
16     public static void sort(String[] a){
17         sort(a,0,a.length-1,0);
18     }
19 
20     public static void sort(String[] a,int lo,int hi,int d){
21         if(hi<=lo){
22             return;
23         }
24         int lt=lo,gt=hi;
25         int v=charAt(a[lo],d);
26         int i=lo+1;
27         while(i<=hi){
28             int t=charAt(a[i],d);
29             if (t<v){
30                 exch(a,lt++,i++);
31             }
32             else if (t>v){
33                 exch(a,gt--,i);
34             }else {
35                 i++;
36             }
37         }
38         sort(a,lo,lt-1,d);
39         if (v>=0){
40             sort(a,lt,gt,d+1);
41         }
42         sort(a,gt+1,hi,d);
43     }
44 
45
相關文章
相關標籤/搜索