希尔排序
算法思想
每一次设置步长n,
每次将
0,n,2n,3n…;
1,n+1,2n+1…
进行排序
该算法其实是插入排序的优化,意在将插入排序中数据比较/移动的次数减少.
注意点
时间复杂度:O(nlog2n)
空间复杂度:O(1)
稳定性:不稳定(虽然是插入排序(稳定)的优化,但是中间是每个step间隔的插入排序,打破了排序的稳定)
实验代码
public class ShellSort {
public static void main(String[] args) {
int[] array = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1};
System.out.println("排序之前:" + Arrays.toString(array));
shellSort(array);
}
public static int[] shellSort(int[] arr) {
// 设置初始步长
int step = arr.length / 2;
do {
// 按照步长进行排序
for (int i = 0; i < step; i++) {
shellSort(arr, i, step);
}
System.out.println("step:" + step + "\tarr:" + Arrays.toString(arr));
step /= 2;
} while (step >= 1);
return arr;
}
public static void shellSort(int[] arr, int start, int step) {
for (int i = start + step; i < arr.length; i += step) {
int temp = arr[i];
int j = i - step;
while (j >= 0 && arr[j] > temp) {
arr[j + step] = arr[j];
j -= step;
}
arr[j + step] = temp;
}
}
}