排序4:希尔排序

/**
 * @desc: 希尔排序
 * @author: 毛会懂
 * @create: 2020-12-23 14:21:00
 **/
public class Shell {

    public static void sort(Comparable[] arr){
        int n = arr.length;
        int h = 1; //根据数组a的长度,确定增长量h的初始值
        while (h < (n >>>1)){  //n >>>1  等价于  n / 2
            h =  h << 1 + 1; // h = h * 2 + 1
        }

        while (h >=1){//控制 增量变化 重新排序的次数
            //插入排序(第一组的第二个元素,对应第h个元素,第二组的第二个元素,对应第h+1个元素)
            for(int i = h;i < n;i++){
                //插入排序
                for(int j = i;j >= h;j-=h){
                    if(isExchange(arr[j-h],arr[j])){
                        exchange(arr,j-h,j);
                    }else{
                        break;
                    }
                }
            }
            h = h >>> 1; // h = h / 2
        }
    }

    private static Boolean isExchange(Comparable o1,Comparable o2){
        return o1.compareTo(o2) > 0;
    }

    private static void exchange(Comparable[] arr,int i,int j){
        Comparable temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

//希尔排序
public static void main(String[] args) {
    Integer[] arr = {10,8,20,30,5,7,4,12,40,30,1,2,4,3,100,5,32,45,23,66,45,7,55,79,6};
    Shell.sort(arr);
    Arrays.asList(arr).forEach(System.out::println);

    Person[] persions = {new Person("b",11),new Person("a",10),new Person("c",12),new Person("b",111),
            new Person("a",5),new Person("c",4)};
    Insertion.sort(persions);
    for (Person person : persions) {
        System.out.println(person);
    }
}

  

原文地址:https://www.cnblogs.com/maohuidong/p/14179477.html