希爾排序(shell』s method)又稱為「縮小增量排序」(diminishing increment sort)。
基本思想:先取乙個小於n的整數d1並作為第乙個增量,將檔案的全部記錄分成d1個組,所有距離為d1倍數的記錄放在同乙個組中,在各組內進行直接插入排序;然後取第二個增量d2設待排序檔案共有10個記錄,其關鍵字分別為47, 33, 61, 82, 71, 11, 25, 47*, 57, 02,增量序列取值依次為5, 3, 1。排序過程如下:
第一趟 dk=5;11 ,25,47*,57,02,47,33,61,82,72
第二趟 dk=3;11 ,02,47*,33,25,47,57,61,82,72
第三趟 dk=1;02 ,11,25,33,47*,47,57,61,72,82
演算法設計:如何設定監視哨?
設某一趟希爾排序的增量為h,則整個檔案被分成h組:(r1, rh+1, r2h+1, …), (r2, rh+2, r2h+2, …), …,(rh, r2h, r3h, …),因為各組中記錄之間的距離均是h,故第1組至第h組的哨兵位置依次為1-h, 2-h, …, 0。
如果像直接插入排序演算法那樣,將待插入記錄ri(h+1≤i≤n)在查詢插入位置之前儲存到監視哨中,那麼必須先計算ri屬於哪一組,才能決定使用哪個監視哨來儲存ri。為了避免這種計算,我們可以將ri儲存到另乙個輔助記錄x中,而將所有監視哨r1-h, r2-h, …, r0的關鍵字設定為小於檔案中任何關鍵字即可。因為增量是變化的,所以各趟排序中所需的監視哨數目也不同,但是我們可以按最大增量d來設定監視哨。具體演算法描述如下:
rectype r[n+d]; /* r[0]~r[d-1]為d個監視哨 ,d=d[0] */
int d[t]; /* d[0]~d[t-1]為增量序列 */
shellsort(rectype r[ ], int d[ ])
{ int i, j, k, h; rectype temp;
int maxint=32767; /* 機器中的最大整數 */
for (i=0; i雜湊函式:用來定義記錄的關鍵字與記錄儲存位置的對應關係的函式。其自變數是記錄的關鍵字,函式值是記錄儲存位置。
雜湊函式的構造方法
應解決兩個問題:
1.雜湊函式應是乙個壓縮映像函式,應具有較
大的壓縮性以節省儲存空間;
2.雜湊函式應具有較好的雜湊性,以儘量減少
衝突的出現。
1.直接定址法:雜湊函式為關鍵字的某個線性函式
2.平方取中法:取關鍵字平方後的中間幾位為雜湊位址
3.摺疊法:將關鍵字分割成位數相同的幾部分,然
後取疊加和(捨去進製)作為雜湊位址。
4.除留餘數法:h(key)= key mod p。
5.數字分析法:使用該方法前應事先知道關鍵字的集
合,然後選取關鍵字的若干位來構成哈
希函式值。
6.隨機演算法:取關鍵字的隨機函式為雜湊位址,即h(key)=random(key)。
處理衝突的方法:
1.開放定址法:使用某種探查技術,在雜湊表中形成乙個探查序列,當衝突發生時,沿此序列逐個單元查詢空閒單元位址。
2.線性探查法
3.平方探查法
4.雙雜湊函式探查法
5.鏈位址法:將所有關鍵字互為「同義詞」的元素鏈結在乙個線性鍊錶中。此時的雜湊表以「指標陣列」的形式出現, 「同義詞」 鍊錶按雜湊位址在「指標陣列」中儲存鍊錶的頭指標。
裝填因子α
α是已存入元素與雜湊空間大小的比例
一般取值為0.6-0.9時產生衝突的可能性較小
例如,若有元素600個,則選取表長為667~1000較為合適。
直接排序和希爾排序
8640 希爾 shell 排序 時間限制 1000ms 長度限制 10kb 提交次數 1858 通過次數 1304 題型 程式設計題 語言 g gcc description 用函式實現希爾 shell 排序,並輸出每趟排序的結果,初始增量d n 2,其後d d 2 輸入格式 第一行 鍵盤輸入待排...
雜湊和雜湊表 門票
時間限制 1 sec 記憶體限制 128 mb 提交 26 解決 2 提交 狀態 討論版 命題人 admin 題目描述 rpk要帶msh去乙個更加神秘的地方!rpk帶著msh穿過廣場,在第1618塊磚上按下了乙個按鈕,在一面牆上隨即出現了乙個把手。rpk握住把手,開啟了一扇石質大門。他們穿過悠長而芬...
Hash和雜湊 雜湊 表
hash又稱為雜湊,是把任意長度的輸入 又叫做預對映pre image 通過雜湊演算法變成固定長度的輸出,該輸出就是雜湊值。hash演算法還有乙個特點,就是很難找到逆向規律。在同一函式下,如果兩個雜湊值是不相同的,那麼這兩個雜湊值的原始輸入也是不同的。hash演算法又被稱為雜湊演算法。雖然被稱為演算...