/**
* 希尔排序
* 时间复杂度:跟增量数列有关,研究表明可以达到O(n^(2/3))。增量为1的时候退化为插入排序 => 最差O(n²),最好O(n)
* 空间复杂度:O(1)
* 稳定性:不稳定。
* 一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱
*/
import java.util.Arrays;
/**
* 希尔排序
* 时间复杂度:跟增量数列有关,研究表明可以达到O(n^(2/3))。增量为1的时候退化为插入排序 => 最差O(n²),最好O(n)
* 空间复杂度:O(1)
* 稳定性:不稳定。
* 一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱
*/
public class 希尔排序 {
public static void main(String[] args) {
int[] arr = {5, 10, 12, 4, 34, 52, 17, 0, 24, 33};
//由小到大排序
System.out.println(Arrays.toString(shellSort(arr)));
}
public static int[] shellSort(int[] arr) {
for (int gap = arr.length / 2; gap > 0; gap /= 2) {//步长,也就是被分为了多少个组
for (int x = gap; x < arr.length; x++) {
int j = x - gap;//需要移动的元素的前一个元素的索引
int temp = arr[x];//需要移动的元素(从每组的第二个元素开始)
while (j >= 0 && arr[j] > temp) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = temp;
}
}
return arr;
}
}