希尔排序
- 希尔排序的思想是使数组中任意间隔为 h 的元素都是有序的。这样的数组被称为 h 有序数组。
- 简单来说,希尔排序和插入排序一致,但插入排序是比较和操作相邻的元素,希尔排序是比较和操作相邻h的元素。
- 希尔排序的效率取决于增量值h的选取,时间复杂度并不是一个定值。开始时,h取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点;其次,h值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,所以继承了直接插入排序的优点,能以近线性的速度排好序。(转自CSDN)
代码实现
package datastructure;
public class ShellSort {
public static void main(String[] args) {
ShellSort shellSort = new ShellSort();
int[] arr = new int[11];
System.out.println("原数组:");
for(int i = 0 ;i < arr.length;i++){
arr[i] = (int)(Math.random() * 20);
System.out.print(arr[i] + " ");
}
System.out.println();
shellSort.sort(arr);
System.out.println("排序后数组:");
shellSort.show(arr);
}
public void sort(int[] arr){
// h为增量
int h = arr.length / 2;
while (h > 0){
for(int i = h; i < arr.length;i++){
for(int j = i ;j >= h && less(arr[j - h] ,arr[j]);j -= h){
exch(arr, j - h,j);
}
}
h /= 2;
}
}
private boolean less(int a ,int b){
// 比大小
return a > b;
}
private void exch(int[] arr,int i,int j){
// 交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void show(int[] arr){
for(int item : arr){
System.out.print(item + " ");
}
System.out.println();
}
}
原数组:
15 0 7 14 8 16 7 8 9 3 7
选择排序后数组:
0 3 7 7 7 8 8 9 14 15 16