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比较的次数是巨大的,数组指针移动消耗性能也是巨大的
而希尔排序 划分后的 【子序列】 保证每次子序列排序后最小的排在最前面,这样即使最后一次比较,相比上面情况也会少很多比较次数,和指针偏移。性能自然能有所保证,且稳定平衡。
 
总结就是数据量大的数据排序时, 心脏不是特别大的 ,担心我说的上面那种小的数据大部分都在后面的情况,相比来说  希尔排序要比插入排序高效。 说白了就是 希尔排序效率能保证稳定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章