資料結構和演算法(三)希爾排序

2022-02-26 04:10:16 字數 944 閱讀 4186

希爾排序是一種基於插入排序的排序演算法。對於大規模的亂序陣列,插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點從陣列的一端移動到另一端。希爾排序為了加快速度簡單的改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序

希爾排序的思想是使陣列中任意間隔為h的元素都是有序的。這樣的陣列被稱為「h有序陣列」。換句話說,乙個h有序陣列就是h個相互獨立的有序陣列編織在一起組成的乙個陣列。在進行排序時,如果h很大,就能將元素移動到很遠的地方,為實現更小的h有序創造方便。

1

public

static

void

sort(comparable a)

8while (h >= 1) 14}

15 h = h / 3;16}

1718 }

增量:

在上面這段**中,使用了序列1/2(3k-1),從n/3開始遞減至1,這個序列叫遞增序列。

在希爾排序中,最常用的遞增序列是希爾增量(n/2),這個最常用但不是最好的。最壞的情況時間複雜度仍為o(n²)。hibbard增量序列(2k

−1),最壞時間複雜度為o(n3/2),平均時間複雜度為o(n5/4);knuth增量序列 1/2(3k-1)。

實現希爾排序的一種方法是對於每個h,用插入排序將h個子陣列獨立的排序,但因為子陣列是相互獨立的,乙個更簡單的方法是在h到子陣列中將每個元素交換到比它大的元素之前去(將比它大的元素向右移動一格)。只需要在插入排序的**中將移動元素的距離由1改為h即可。

希爾排序更高效的原因是它權衡了子陣列的規模和有序性。排序初,各個子陣列都很短,排序後子陣列都是部分有序,這兩種情況都很適合插入排序。

結論:希爾排序比插入排序和選擇排序更高效,並且陣列越大,優勢越大。且**量小,不需要使用額外的記憶體空間。

資料結構和演算法 排序演算法 希爾排序

希爾排序 希爾排序 希爾排序就是插入排序的一種改進版本,演算法的步驟 把乙個序列不視為乙個整體,而是視為多個子串行,假設間隔是gap 4 alist 54,26,93,17,77,31,44,55,20 54,26,93,17,77,31,44,55,20 54 77 20 這是1 組,間隔是4,2...

資料結構 演算法 希爾排序

希爾排序過程 希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列 步長更長了,列數更少了 來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。def shell sort alist 希爾排序 n len...

資料結構 選擇排序演算法和希爾排序演算法詳解

選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置 下列 是插入排序的內層迴...