插入排序的顺序
JAVA-插入排序与希尔排序_希尔排序

插入排序的顺序就如同抓扑克牌
刚开始你抓的是1
然后你即将迎来第一次插入排序
你抓了张3发现3>1,所以3就排在了1的后边
然后第2次插入排序你抓了张2
发现2<3,所以需要将2插入到3的前边就是这样
如此反复...
你会发现5个数需要4次插入排序

代码

package 排序;

/**
 * @author 邓雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-10-31-17-47
 */
public class 插入排序 {
    public static void main(String[] args) {
        int[] ints = new int[]{2,1,0,-1,1};
        insertSort(ints);
        for(int anInt:ints){
            System.out.print(anInt+" ");
        }
    }

    public static void insertSort(int[] arr){
        //i从1开始也是插入排序的次数为arr.length-1
        for(int i=1;i<arr.length;i++){
            int insertIndex = i;//arr[i]待插入的下标:inserIndex
            int insertValue = arr[i];//待插入的值
            //内层的while循环是找arr[i]待插入的位置,以及把arr[i]前面的数往后挪
            while (insertIndex > 0 && insertValue<arr[insertIndex-1])
            {
                //将arr[i]前面的值往后挪(如过前面的数>arr[i])
                arr[insertIndex] = arr[insertIndex-1];
                insertIndex--;
            }
            //此时就已经确定了arr[i]的下标的位置insertIndex
            arr[insertIndex] = insertValue;
        }
    }
}

运行结果

-1 0 1 1 2 

希尔排序和插入排序很相似,插入排序就是步长为1的插入排序,而希尔排序也只是步长从大到小的区别
希尔排序代码

package 排序;

/**
 * @author 邓雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-10-31-18-33
 * 比插入排序效率更好一点
 */
public class 希尔排序 {
    public static void main(String[] args) {
        int[] ints = new int[]{2,1,-1,0,4};
        shellSort(ints);
        for(int anInt:ints){
            System.out.print(anInt+" ");
        }
    }
    //希尔排序
    public static void shellSort(int[] arr){
        //步长  gap
        for (int gap = arr.length/2; gap>0 ; gap/=2) {
            for (int i = gap; i < arr.length; i++) {
                //插入式 间隔为gap的插入排序
                int insertIndex = i;
                int insertValue = arr[i];
                while (insertIndex-gap>=0 && insertValue<arr[insertIndex-gap]){
                    arr[insertIndex] = arr[insertIndex-gap];//大的往后交换
                    insertIndex-=gap;
                }
                //insertIndex就是insertValue该插入到的下标
                arr[insertIndex]=insertValue;
            }
        }
    }
}

运行结果

-1 0 1 2 4