重點 步長 = 數組的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比較的次數是巨大的,數組指針移動消耗性能也是巨大的而希爾排序 劃分後的 【子序列】 保證每次子序列排序後最小的排在最前面,這樣即使最後一次比較,相比上面情況也會少很多比較次數,和指針偏移。性能自然能有所保證,且穩定平衡。總結就是:數據量大的數據排序時, 心臟不是特別大的 ,擔心我說的上面那種小的數據大部分都在後面的情況,相比來說 希爾排序要比插入排序高效。 說白了就是 希爾排序效率能保證穩定
java - 希爾排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.