希尔排序
前言
- 数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;
- 数据序列2: 13-17-20-42-14 利用插入排序,13-14-17-20-42. Number of swap:3;
如果数据序列基本有序,使用插入排序会更加高效。
基本思想
- 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
- 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
实现过程
public class 希尔排序 {
public static void main(String[] args) {
int[] arr = new int[]{59, 20, 17, 13, 28, 14, 23, 83};
shellSort(arr, arr.length);
for (int i : arr) System.out.println(i);
}
public static void shellSort(int array[], int lenth) {
int temp = 0;
int 间隔 = lenth;
do {
间隔 /= 2;
// 控制序列
for (int k = 0; k < 间隔; k++) {
// 循环序列-根据间隔
for (int i = k + 间隔; i < lenth; i += 间隔) {
// 根据当前间隔,依次插入排序
for (int j = i; j > k; j -= 间隔) {
if (array[j] < array[j - 间隔]) {
temp = array[j];
array[j] = array[j - 间隔];
array[j - 间隔] = temp;
}
}
}
}
} while (间隔 != 1);
}
}
算法特点
- 时间复杂度O(nd)此处的d为
- 额外空间复杂度O(1+1)约等于 O(1)
- 不稳定,替换过程,相等数值会替换位置