希尔排序
希尔排序又称缩小增量排序,是1959年由D.L.Shell提出来的。先取定一个小于n的整数gap1作为第一个增量,把整个序列分成gap1组。所有距离为gap1的倍数的元素放在同一组中,在各组内分别进行排序(分组内采用直接插入排序或其它基本方式的排序)。 然后取第二个增量gap2<gap1,重复上述的分组和排序。 依此类推,直至增量gap=1,即所有元素放在同一组中进行排序为止。
开始时 gap 的值较大, 子序列中的元素较少, 排序速度较快。 随着排序进展, gap 值逐渐变小, 子序列中元素个数逐渐变多,由于前面大多数元素已基本有序, 所以排序速度仍然很快。 分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体上看是减小了。 Gap的取法有多种。 shell 提出取 gap = n/2 ,gap = gap/2 ,…,直到gap = 1。gap若是奇,则gap=gap+1
//////////////希尔排序////////////////
@Test
public void shellSort( ){
int a[] = new int[]{1,3,21,0,25,49,25,16,8,23,45,-3,4};
for(int gap=(a.length+1)/2; ; ){ //分组
//为便于大家理解shell排序算法,这里用冒泡进行组内排序
for(int i=0;i<a.length-gap;i++){//AC
//for(int i=0;i<gap;i++){//WA
for(int j=i;j<a.length-gap;j+=gap){
if(a[j]>a[j+gap]){
swap(a,j,j+gap);
}
}
}
if(gap>1){
gap=(gap+1)/2;
}else{
break;
}
}
print(a);
}