因爲LeetCode上的算法題不少涉及到一些基礎的數據結構,爲了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、並查集、圖等等大概幾十篇。git
希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。github
希爾排序是基於插入排序的如下兩點性質而提出改進方法的:算法
希爾排序的基本思想是:先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。編程
選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;數組
按增量序列個數 k,對序列進行 k 趟排序;數據結構
每趟排序,根據對應的增量 ti,將待排序列分割成若干長度爲 m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲 1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長度。數據結構和算法
來源:github.com/hustcc/JS-S…編程語言
首先,選擇增量 gap = 10/2 ,縮小增量繼續以 gap = gap/2 的方式動畫
初始增量爲 gap = 10/2 = 5,整個數組分紅了 5 組3d
按顏色劃分爲【 8 , 3 】,【 9 , 5 】,【 1 , 4 】,【 7 , 6 】,【 2 , 0 】
對這分開的 5 組分別使用上節所講的插入排序
結果能夠發現,這五組中的相對小元素都被調到前面了
縮小增量 gap = 5/2 = 2,整個數組分紅了 2 組
【 3 , 1 , 0 , 9 , 7 】,【 5 , 6 , 8 , 4 , 2 】
對這分開的 2 組分別使用上節所講的插入排序
此時整個數組的有序性是很明顯的
再縮小增量 gap = 2/2 = 1,整個數組分紅了 1 組
【 0, 2 , 1 , 4 , 3 , 5 , 7 , 6 , 9 , 0 】
此時,只須要對以上數列進行簡單的微調,不須要大量的移動操做便可完成整個數組的排序
爲了更好的讓讀者用本身熟悉的編程語言來理解動畫,筆者將貼出多種編程語言的參考代碼,代碼所有來源於網上。
你能夠關注公衆號 五分鐘學算法 獲取更多排序內容。