希尔排序是在直插排序的基础上进行的一直增量排序(其实是一种分组排序)
希尔排序比直插排序好在利用了直插排序的特点:有序时时间复杂度小
基本思想也是核心步骤:
按照一定分量来分组
对于每组进行直插排序
给个简单示例:
待排序数组: [7, 6, 3, 4, 5, 2, 1]
第一次 : [4, 6, 3, 7, 5, 2, 1] 分量n=7/2=3
[1, 6, 3, 4, 5, 2, 7]
[1, 5, 3, 4, 6, 2, 7]
[1, 5, 2, 4, 6, 3, 7]
第二次 : [1, 5, 2, 4, 6, 3, 7] 分量n=n/2=1
[1, 2, 5, 4, 6, 3, 7]
[1, 2, 4, 5, 6, 3, 7]
[1, 2, 4, 5, 6, 3, 7]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] //结束
核心代码:
for(int gap =n/2;gap>0;gap/=2){ for(int i=0;i<gap;i++){ for(int j=i+gap;j<n;j+=gap){ int temp = array[j]; int k=j-gap; while(k>=0&&array[k]>temp){ array[k+gap]=array[k]; k-=gap; } array[k+gap]=temp; } } }
该算法的分析:
稳定性: 不稳定
时间复杂度:
希尔排序的执行时间依赖于增量取值。
由于希尔排序的目的是增加有序的趋势,所以希尔排序的性能优于直接插入排序。
空间复杂度:
也仅仅只需要一个单元--temp。
希尔有很多简化方式,那是因为在增量为1时肯定会排好。但是希尔排序的优化却仅仅取决于增量的选取,但如何选取最优增量似乎还没有最好的方法。
原文地址:http://11291891.blog.51cto.com/11281891/1771011