不看《演算法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...