希尔排序
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;
}
}
}
- 最坏情况:
T
=
Θ
(
N
2
)
T =\Theta(N^2)
T=Θ(N2)
希尔增量序列
- 原始希尔排列
D
M
=
[
N
/
2
]
,
D
k
=
[
D
k
+
1
/
2
]
D_M=[N/2],D_k=[D_{k+1}/2]
DM=[N/2],Dk=[Dk+1/2]
- Hibbard增量序列
-
D
k
=
2
k
−
1
D_k=2^k-1
Dk=2k−1 相邻元素互质
- 最坏情况:
T
=
Θ
(
N
3
/
2
)
T=\Theta(N^{3/2})
T=Θ(N3/2)
- 猜想:
T
a
v
g
=
O
(
N
5
/
4
)
T_{avg}=O(N^{5/4})
Tavg=O(N5/4)
- Sedgewick增量序列
- {1,5,19,41,109,…}
- 猜想:
T
a
v
g
=
O
(
N
7
/
6
)
,
T
w
o
r
s
t
=
O
(
N
4
/
3
)
T_{avg}=O(N^{7/6}),T_{worst}= O(N^{4/3})
Tavg=O(N7/6),Tworst=O(N4/3)
void ShellSort( ElementType A[], int N )
{
int Si, D, P, i;
ElementType Tmp;
int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
for ( Si=0; Sedgewick[Si]>=N; Si++ )
;
for ( D=Sedgewick[Si]; D>0; D=Sedgewick[++Si] )
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;
}
}