重点 步长 = 数组的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 - 希尔排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.