java - 希爾排序

 重點   步長 =  數組的length/2(向下取整)
 
    例子   : 【23,4,13,56,33,66,12,32,22】    數組長度爲 9    ,步長:9/2 = 4
 
子序列1 :【23,                       33,                    22】         直接插入排序後   【22,                23,                   33】
子序列2 :【        4,                       66                     】         直接插入排序後   【    4,                    66                     】
子序列3 :【              13,                      12              】         直接插入排序後   【        12,                     13              】
子序列4 :【                     56,                       32      】         直接插入排序後   【              32,                     56        】
 
                                                                                        ||
                                                                                        ||
                                                                                        ↓
 
 第一次     【22,4,12,32,23,66,13,56,33】   步長:步長/2 =2
 
子序列1 :【22,     12           23           13          33 】         直接插入排序後   【12,    13        22         23         33 】
子序列2 :【        4,       32           66          56        】         直接插入排序後   【      4           32       56         66        】
 
                                                                                        ||
                                                                                        ||
                                                                                        ↓
 
第二次      【 12,4,13,32,22,56,23,66,33】  步長:步長/2 =1 
 
                                                              因爲步長=1 ,所以只需要做組後一次直接插入排序了
                                                                                        ||
                                                                                        ||
                                                                                        ↓
 
最後一次  【4,12,13,22,23,32,33,56,66】
 
 
思考:爲什麼不直接用插入排序 ,而用希爾排序 (前提數據量不容小覷)
首先要知道 :直接插入排序是 原數組A元素 與 依次遍歷插入新生成的數組B  從後往前比較,  最後新數組B 纔是正常排序 的,所以如果一個數據很大的數組A  最小的元素集中在 數組A尾部,那麼 與新插入生成的數組B比較的次數是巨大的,數組指針移動消耗性能也是巨大的
而希爾排序 劃分後的 【子序列】 保證每次子序列排序後最小的排在最前面,這樣即使最後一次比較,相比上面情況也會少很多比較次數,和指針偏移。性能自然能有所保證,且穩定平衡。
 
總結就是數據量大的數據排序時, 心臟不是特別大的 ,擔心我說的上面那種小的數據大部分都在後面的情況,相比來說  希爾排序要比插入排序高效。 說白了就是 希爾排序效率能保證穩定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章