希尔排序
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
思路
如序列:9 8 7 6 5 4 3 2 1
- 确定一个增量序列,如4(length/2) 、2 、1 ,从大到小使用增量
- 使用第一个增量,将序列划分为若干个子序列,下标组合为0-4-8, 1-5, 2-6,3-7
- 依次对子序列使用直接插入排序法;
- 使用第二个增量,将序列划分为若干个子序列(8-2-4-6-8),(1-3-5-7)
- 依次对子序列使用直接插入排序法:
- 使用第三个增量1,这时子序列就是元序列(0-1-2-3-4-5-6-7-8) ,使用直接插入法
- 完成排序。
时间复杂度:不太确定在0 (nlogn) ~0 (n2)之间
空间复杂度: 0(1)
原址排序
稳定性:由于相同的元素可能会被划分至不同子序列单独排序,因此稳定性是无法保证的——不稳定
代码:
//希尔排序
public static void shellSort(int[] arr) {
//外层循环:确定增量,内层循环:判断各个组
for(int i = arr.length / 2; i > 0; i /= 2) {
for(int j = i; j < arr.length; j++) {
int target = arr[j];
int k = j - i;
while(k > -1 && target < arr[k]) {
arr[k + i] = arr[k];
k -= i;
}
arr[k + i] = target;
}
}
}
//插入排序
public static void sort(int[] arr) {
for(int i = 1 ; i < arr.length; i++) {
int target = arr[i];
int j = i - 1;
while(j > -1 && target < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = target;
}
}