快速理解插入排序(非降序排序,从前开始的排序)
插入排序类似于打牌,左侧是已经排好的序列,右侧是没有排好的序列
用y表示已经排好序的序列下标,用n表示没排序的下标,并且假设序列的下标 从0开始
先看一波伪代码:

  1. int n,y
  2. for n=1 to arr.length
  3. key = arr[n]
  4. for(y = n-1;y>=0 && key<arr[y];y--)
  5. arr[y+1] = arr[y]
  6. arr[y+1] = key
  7. return arr

image.png
我们可以参考一下《算法导论》给出的插入排序
因为它给出的数组默认下标是1,所以j是从2开始,while循环是A[j]>key


/**
 * 插入排序
 * 类似于打牌是抽牌放位置
 */
public class InsertionSort {

    /**
     * 非降序排序
     * @param arr
     * @return
     */
    public static int []  InsertionSort(int arr[]){
        int n,y;  //n 指未排序的,y指以排好序的
        for(n = 1;n<arr.length;n++){
            int key = arr[n];    //取出一张未排序的牌
             //找出空位 实际按照理论y应该是空位,但是最后又执行了一次y--,所以最后的空位应该是y+1
            for(y = n-1;y>=0 && arr[y]>key;y--){  
                arr[y+1] = arr[y];
            }
            arr[y+1] = key;  //把牌放入到y+1的空位中
        }

        return arr;
    }

    public static void main (String [] args){
        int arr[]={5,4,3,2,1};
        arr = InsertionSort(arr);

        //输出
        for(int num : arr){
            System.out.print(num+" ");
        }
    }
}

插入排序分析

时间复杂度:
空间复杂度:
稳定性: