資料結構和演算法 字串 (二 字串排序 上)

2021-10-25 22:03:36 字數 2778 閱讀 3895

不看《演算法4》都不知道字串排序也能講這麼多,之前還以為就是簡單的strcmp就完事了,不過看了發現沒這麼簡單,沒這麼簡單的話,就趕緊來學一學吧。

之前是不打算寫這個的,直到我看到後面了之後,才發現需要寫乙個對比,才能更好的理解後面的字元排序法,所以就起了乙個0的序號。

從排序說起,我們學過的排序有冒泡,快排等,但是仔細想了一下,我們之前用的排序都是直接用值比較,不過字串我們也有函式,strcmp,但是這樣的話效率就很低下,所以有必要來研究研究字串排序的方法。

這篇文章本來想看懂再寫的,結果發現,這個建索引計數法,怎麼都看不懂,還拖慢了進度,那就乾脆一遍寫一遍看,這樣效率反而搞了點。

我們就按《演算法4》的題目自己實現一遍,說實話,我現在還沒看懂,不過可以先實現、

老師在統計學生分數時會遇到以下資料處理問題。學生分為若干組,標號為1 、2 、3等。在某些情況下,我們希望全部同學按組分類。因為組的編號是較小的整數,使用鍵索引計數法來排序很合適。

假設陣列stu中的每個元素都儲存了乙個名字和乙個組號,其中組號在0-r-1之間,如下:

struct student

;student stu=

,,,,

,,,,

,,,,

,,,,

,,,}

;//strsort的建構函式,就是把陣列準備好

strsort::

strsort

(int count_size)

頻率統計其實就是統計一共有多少個共同的key。

使用int陣列count計算每個鍵出現的頻率

對於陣列中的每個元素,都使用它的鍵訪問count中的相應元素並將其加一

**如下:

/*

使用int陣列count計算每個鍵出現的頻率

對於陣列中的每個元素,都使用它的鍵訪問count中的相應元素並將其加一

*/int

*strsort::

freqcount

(student *stu,

int stu_len)

return m_count;

}

使用count來計算每個鍵在排序結果中的起始索引位置

例:第一組有3個人,第二組有5個人,因此第三組中的同學在排序結果陣列中的起始位置為8。

白話:其實就是把,每個組的基數算出來,然後每個組就在這個基數上操作。

**如下:

/*

使用count來計算每個鍵在排序結果中的起始索引位置

例:第一組有3個人,第二組有5個人,因此第三組中的同學在排序結果陣列中的起始位置為8

*/int strsort::

convindex()

return0;

}

其實我很不理解,乙個一維陣列幹啥用二維的方式表示,我之前的看的懵逼了,你們如果也懵逼的話,就要把這個圖當做一維陣列來看。

convindex count[0]

=0convindex count[1]

=0convindex count[2]

=3convindex count[3]

=8convindex count[4]

=14

這樣畫不香麼

在將count陣列轉換成一張索引表之後,將所有元素移動到乙個輔助陣列aux中進行排序。

每個元素在aux中的位置是由它的鍵對應的count值決定。

**如下:

/*

在將count陣列轉換成一張索引表之後,將所有元素移動到乙個輔助陣列aux中進行排序。

每個元素在aux中的位置是由它的鍵對應的count值決定。

*/int strsort::

datafen

(student *stu,

int stu_len)

for(

int i=

0; i

)//回寫

for(

int i=

0; i

)delete

aux;

return0;

}

圖示:

第乙個圖我也沒看,沒眼看,不知道為什麼畫的這麼複雜,增加理解難度啊,真是的、

第二個還是比較容易理解的,就是通過索引,然後找到自己對應的坑位就可以了。

這個就簡單了,因為我們在排序的時候,是使用到了輔助陣列,所以最後一步需要我們把排序後的結果賦值回去。

**已經寫出來,不過感覺封裝的太水了,目前先這樣吧,路徑:…/code/strsort.cpp

好像我看著就是在從低位開始,一遍一遍的使用建索引計數法就行的排序。

下面直接上**:

void lsd::sort(std::string *a, int a_len, int w)

for (int r =0; r < r; r++) // 將頻率轉換為索引

for (int i=0; i是不是有點奇怪,說從低位排起,按照我們的習慣應該是高位排起,不過仔細想想從低位排期會先把低位就緒,然後再排高位,很反過來排序的效果是一樣的。

下一次就可以安排高位優先排序了。

完整**路徑:…/code/lsd.cpp

資料結構實驗之串二 字串匹配(字串雜湊)

給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現空格。string1和string2大小不超過100字元 對於每組輸入資料,...

資料結構實驗之串二 字串匹配(字串雜湊)

給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現空格。string1和string2大小不超過100字元 對於每組輸入資料,...

資料結構3 字串

string的基本操作函式要會,拷貝,查詢 hw筆試第一題,兩個字串,前面是全量字符集,後面是已占用字符集 用 隔開 輸出剩餘的字符集。1 include2 include3 using namespace std 4string stringoperate string str1,string s...