**一.希尔排序:**希尔排序也是一种简单的插入排序,它是在直接插入排序算法基础上改进的,也称为缩小增量排序。是第一个突破O(n^2)的时间复杂度的算法。
**二.基本思想:**希尔排序是先把序列中元素按照下标的一定增量分组,每次对所有分组进行简单插入排序,下一次再缩小增量,再次按照规则分组,再次执行简单插入排序,最后直到增量为1,这时再做微微调整就可以把无序序列排好序了。(整个排序过程中形成的增量,组成一个增量序列)
三.算法步骤:
1.选择一个增量序列,t1,t2…tk ti>tj,tk=1;
2.按照增量个数k,对序列进行k次排序
3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
四.算法图解
五.JAVA代码实现
package sort8;
public class ShellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShellSort ss=new ShellSort();
int []arry={12,3,12,54,65,761,2,65,76,223};
ss.shellsort(arry);
for(int i=0;i<arry.length;i++){
System.out.print(arry[i]+" ");
}
}
public void shellsort(int[] a){
for(int gap=a.length/2;gap>0;gap/=2){
for(int i=gap;i<a.length;i++){
int j;
int temp=a[i];
for( j=i-gap;j>=0&&a[j]>temp;j-=gap){
a[j+gap]=a[j];
}
a[j+gap]=temp;
}
}
}
}
结果实现
2 3 12 12 54 65 65 76 223 761
**总结:**本文介绍了希尔排序的基本思想及其代码实现,希尔排序中对于增量序列的选择十分重要,直接影响到希尔排序的性能。我们上面选择的增量序列{n/2,(n/2)/2…1}(希尔增量),其最坏时间复杂度依然为O(n2),一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n3/2)。其他排序算法也会陆续更新,敬请期待哦!