輸入字串和字串對應的組別(組別也是字串的鍵)
在滿足組別有小到大排序的情況下,將字串按字母順序排序
第一步,記錄組別的頻率
(為了得到某個字串在排序後的範圍,比如組別2肯定在組別1後面,在組別3前面,把每個組別有多少個人記錄下來,方便我們定位)
第三步,分類
該組別的位置起點 向後挪一位 (因為當前位被用了)
第四步,複製
索引計數法是穩定的
int n = a.length;
string[
] aux =
newstring
[n];
//訪問陣列n次
int[
] count =
newint
[r+1];
//訪問陣列r+1次
// compute frequency counts.
for(
int i =
0;i)//訪問陣列2n次
count[a[i]
.key()
+1]++
;// transform counts to indices.
for(
int r =
0;r)//訪問陣列2r次,進行r次加法
count[r+1]
+=count[r]
;// distribute the records.
for(
int i =
0;i)//訪問陣列3n次,使計數器值增大n次並移動資料n次
aux[count[a[i]
.key()
]++]=a[i]
;// copy back.
for(
int i =
0;i)//訪問陣列2n次,移動資料n次
a[i]
=aux[i]
;
結合索引排序,從字串的低位(從右面開始),從右到左,每個字元都當一次該字串的鍵,給整個字串排序
以下**的侷限性:每個字串的長度是相等的。稍作修改可適應不等長的字串。
空間: r+n
public
class
lsd}
}
考慮不等長字串的比較
public
class
msdpublic
static
void
sort
(string[
] a)
// sort from a[lo] to a[hi], starting at the dth character.
private
static
void
sort
(string[
] a,
int lo,
int hi,
int d)
int[
] count =
newint
[r +2]
;// 陣列大小r+2
for(
int i = lo; i <= hi; i++
)// compute frequency counts.頻次,只累計了hi-lo+1次
count[
charat
(a[i]
, d)+2
]++;// 每個對應數字在原來基礎上+1
for(
int r =
0; r < r +
1; r++
)// transform counts to indices. 索引
count[r +1]
+= count[r]
;for
(int i = lo; i <= hi; i++
)// distribute.丟到對應組別裡去
aux[count[
charat
(a[i]
, d)+1
]++]= a[i]
;// 每個對應數字在原來基礎上+1
// aux的賦值從aux[0]開始,到aux[hi-lo]結束
// 在這裡count會發生變化。原來這裡的count只是為了移動到下一位為下乙個元素找位置用,現在這裡的count[i]還可以通過是否到達count[i+1]來判斷是否可以結束遞迴
for(
int i = lo; i <= hi; i++
)// copy back. 注意aux的起終點和a的對應關係
a[i]
= aux[i - lo]
;// recursively sort for each character value.
for(
int r =
0; r < r; r++
)//私認為初始化條件r=1更好,因為r=0都是字元為空的子字串
sort
(a, lo + count[r]
, lo + count[r +1]
-1, d +1)
;// 將當前相同字元的分為一組,每組以下一位字元為比較物件排序
}}
msd
public
class
quick3string
public
static
void
sort
(string[
] a)
private
static
void
sort
(string[
] a,
int lo,
int hi,
int d)
// a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]
sort
(a, lo, lt -
1, d);if
(v >=0)
// d位字母相同且不為空,則這部分從下一位開始再比較
sort
(a, lt, gt, d +1)
;sort
(a, gt +
1, hi, d);}
}
字串 字串排序
頻率統計 將頻率轉換為索引 資料分類 回寫頻率統計 統計每個字元出現的次數 將頻率轉換為索引 確定不同字元首位置 從右到左檢查檢查鍵中的字元 public class lsd public class msd public static void sort string a private stat...
字串排序演算法
主要內容 鍵索引計數法 低位優先lsd 高位優先msd 三向字串快速排序 字串排序演算法總結比較 假定給定乙個字串數字,要求將該字串陣列排序。規定字串中的字元全集基數為r,即字串中的每個字元都是字母表中某乙個字元,其索引為 0,r 假定給定的字串陣列為單個字元陣列,假定基數256即每個字元在字母表中...
字串演算法 字串雜湊
方法以,m進製的形式來表示乙個字串,那麼這個字串就可以輕鬆計算 i j 之間的hash值 當只有小寫 大家字母時,m 131 而hash值,可以使用unsigned long long 來表示,這時不再需要求餘 方法應用 字串匹配。思路 對比hash值 允許k次失配的字串匹配 即 允許k次字元值不對...