希尔排序:
通过插入排序里交换数字之间的间隔,来使得交换更高效。
step1:定义一个增量序列:Dm>Dm-1>……>D1=1
step2:对每一个Dk进行“Dk-间隔"排序 (
K=M,M-1,……1)
1.原始希尔排序:
Dm=[N/2],Dk=[Dk+1/2]
void Shell_sort(ElementType A[],int N)
{
for(D=N/2;D>0;D/=2)//希尔增量排序
{
for(P=D;p<N;p++)
{
Tmp=A[P];
for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
{
A[i]=A[i-D];
}
A[i]=Tmp;
}
}
}
2…更多的增量序列
2.1 Hibbard增量序列
Dk=2^k-1
2.2Sedgewick增量序列
{1,5,19,41,109,……}