對字串使用基數排序,以前,我一直覺得:因為字串的長度不一,無法使用基數排序。前兩天因為有需要,忽然想通了!即便長短不一,也可以使用鏈式基數排序!
首先,將字串長度當作最低有效位,因為基數排序是從最低有效位開始排的,就先用分配-收集演算法對長度做一趟。對字串中的具體某一位字元進行排序相比,演算法是一樣的,只是寫法稍有不同。要將排序結果的lenradix指標儲存起來,後面要用。
接下來,從lenradix中取字串最長的那個sublist,對該sublist排序,然後將這一趟的結果first儲存起來,連線到長度次短的那個sublist之後,然後對這兩個鏈結起來的列表進行一趟分配-收集。如此,直到最高有效位。
所有的工作就做完了,根據此演算法,對所有待排序字串中的每個字元,均需要一次且僅一次訪問!另外,還需要 o((radix+1)*max_str_len)的時間複雜度用於掃瞄鏈結表,(radix+1)是因為還有乙個strlen鏈結表。所以,總的時間復 雜度是o(n+(radix+1)*max_str_len),其中n是所有字串的總字元數。
在排序過程中,可以插入乙個codetab,來實現不同的排序準則(例如忽略大小寫),如果提供了wchar_t codetab,就按 wchar_t 排序,如果wchar_t codetab 非 null,就按轉換了的 wchar_t 排序。
如果對unicode排序,最好指定乙個codetab,把radix變小,不然的話,時間複雜度就太大了!
經過測試,在大約20000~30000個字串的情況下,比std::sort快5~7倍。資料規模再增大,至5,000,000個字串時,比std::sort大概快1.8~2.5倍!
測試(bench mark)**:
字串基數排序
對字串使用基數排序,以前,我一直覺得 因為字串的長度不一,無法使用基數排序。前兩天因為有需要,忽然想通了!即便長短不一,也可以使用鏈式基數排序!首先,將字串長度當作最低有效位,因為基數排序是從最低有效位開始排的,就先用分配 收集演算法對長度做一趟。對字串中的具體某一位字元進行排序相比,演算法是一樣的...
排序 基數排序
基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...
排序 基數排序
1 基數排序 桶排序 介紹 1 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用 2 基數排序法是屬於穩定性的排序,基數...