《演算法》 字串 字串排序

2021-10-09 10:26:01 字數 3260 閱讀 2525

輸入字串和字串對應的組別(組別也是字串的鍵)

在滿足組別有小到大排序的情況下,將字串按字母順序排序

第一步,記錄組別的頻率

(為了得到某個字串在排序後的範圍,比如組別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次字元值不對...