八大排序算法之插入排序

时间复杂度:O(N^2)
额外空间复杂度:O(1)
是否可实现稳定性:是

思路:

插入排序的过程类似于打扑克牌抓牌的过程,每次把抓到小的排插到前面
插入排序的外层循环,用来控制数组的下标i从1开始;内层循环,从j=i-1开始,比较j和j+1的大小,然后依次向前两两比较,每次把当前传入的数的最小值放到最前面

例子:

比如一组数字 {2,1,1,6,8}
第一次比较1<2 所以交换2和1的位置,此时排序的顺序是1 2 1 6 8
第二次传入1 首先比较 2>1 所以交换2和1的位置,然后比较 1 = 1 所以不交换,这一轮比较的排序结果是1 1 2 6 8
依次类推

代码:

    public static void insertionSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }

        /*
        * 相当于打牌 抓牌的过程  小的插前面
        * 外层循环 初始化i = 1
        * 内循环 j = i-1  当j>=0并且arr[j]>arr[j+1] 交换位置 j--继续循环,往前找
        * 直到循环到下标0
        * 把每次内循环找的的最小的数放到最前面
        * */
        for (int i = 1; i < arr.length; i++) {
            for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
                swap(arr, j, j + 1);
            }
        }
    }

    public static void swap(int[]arr,int i ,int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

在这里还可以帮助理解插入排序是否稳定,如我刚才举的例子,当1=1时,不叫唤位置,所以两个1在排序前后相对顺序没有变,印证了插入排序是稳定的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,587评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,086评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,025评论 0 2
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,234评论 0 1
  • salen小伦阅读 1,313评论 2 0