思想
分组并在每个组内进行插入排序
代码
public static void shellSort(int[] arr) {
for(int gap = arr.length / 2; gap > 0; gap /= 2) {
for(int i = gap; i < arr.length; i++) {
int temp = arr[i];
int j;
for(j = i - gap; j >= 0; j -= gap) {
if(arr[j] > temp) {
arr[j+gap] = arr[j];
}else{
break;
}
}
arr[j+gap] = temp;
}
}
}
性能分析
时间复杂度: 很难证明,记结论
- 最好: O ( n 1.3 ) O(n^{1.3}) O(n1.3)
- 平均: O ( n 1.5 ) O(n^{1.5}) O(n1.5)
- 最差: O ( n 2 ) O(n^{2}) O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)
稳定性: 不稳定, 例如
4
,
2
,
2
,
1
4, 2, 2, 1
4,2,2,1在
g
a
p
=
2
gap = 2
gap=2,第二个2会移动到第一个2的前面。