希尔排序
给定一个如下的增量序列,作为排序间隔,对每个Dk做“Dk-间隔”的排序,间隔排序采用插入排序
性质:“Dk-间隔”有序的序列,在执行“Dk-1-间隔”排序后,仍然是“Dk-间隔”有序的
Hibbard 增量序列
Dk = 2^k–1(相邻元素互质 )
最坏情况: T = O( N^3/2 )
猜想: Tavg = O ( N^5/4 )
Sedgewick增量序列
{1, 5, 19, 41, 109, … } ,通式:9 *4^ i – 9*2^ i + 1 或 4^i – 3*2^i + 1
猜想:Tavg = O ( N^7/6 ) ,Tworst = O ( N^4/3 )
Java实现(使用Hibbard 增量序列 )
class Sort{
int N;
long a[] = new long[100005];
public void shellSort(){
int k = (int)(Math.log10(N+1)/Math.log10(2));
while (k >0) {
int D = (int)Math.pow(2,k)-1;
k--;
int j;
for (int i = D; i < N; i++) {
long tmp = a[i];
for (j = i; j >=D && a[j-D] > tmp; j-=D)
a[j] = a[j-D];//move a[j-D] backward
a[j] = tmp;//insert
}
}
}
}