希尔排序是以插入排序为基础的排序算法,搞懂了插入排序之后再来看希尔排序就十分简单了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
static
void
sort(
int
[] array) {
if
(array ==
null
|| array.length <=
1
)
return
;
int
length = array.length;
//i用来控制每次排序的前后数的间隔
for
(
int
i = length /
2
; i >
0
; i /=
2
) {
for
(
int
j = i; j < length; j++) {
//下面是插入排序的步骤
int
temp = array[j];
int
k = j;
while
(k >= i && temp < array[k - i]) {
array[k] = array[k - i];
k -= i;
}
array[k] = temp;
}
}
}
|
最优时间复杂度:O(n)
平均时间复杂度:O(n^1.3)
最坏时间复杂度:O(n^2)
平均空间复杂度:O(1)
希尔排序可以通过对于排序前后间隔的值控制来做到最优化结构,最优化的结构为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
static
void
sort(
int
[] array) {
int
out, in, temp;
int
length = array.length;
int
h =
1
;
if
(h < length /
3
) {
h =
3
* h +
1
;
}
while
(h >
0
) {
for
(out = h; out < length; out++) {
temp = array[out];
in = out;
while
(in >= h && array[in - h] > temp) {
array[in] = array[in - h];
in -= h;
}
array[in] = temp;
}
h = (h -
1
) /
3
;
}
}
|
算法的思想是一样的,但是对于结构的控制可能有所不同。
希尔排序因为前后间隔值的变化可能会导致相同的元素出现位置错乱,所以也是不稳定的。