O(n^2)级排序之插入排序

【注】以下代码参考力扣<<排序算法全解析>>
插入排序:插入排序分为两种,本质上都是向数组中有序的小范围中插入一个元素使数组中有序的范围不断扩大。
   法一:插入元素与有序范围内元素按顺序比较,满足交换条件则交换位置,否则找到插入元素位置并跳出本轮。
在这里插入图片描述

public static void insertSort(int[] arr) {
    // 从第二个数开始,往前插入数字
    for (int i = 1; i < arr.length; i++) {
        // j 记录当前数字下标
        int j = i;
        // 当前数字比前一个数字小,则将当前数字与前一个数字交换
        while (j >= 1 && arr[j] < arr[j - 1]) {
            swap(arr, j, j - 1);
            // 更新当前数字下标
            j--;
        }
    }
}
private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

   法二:用一个变量保存插入元素值,将该值按顺序与有序范围内元素比较,满足交换条件则将对应的非插入元素移动,否则找到插入元素位置并跳出本轮。

在这里插入图片描述

public static void insertSort(int[] arr) {
    // 从第二个数开始,往前插入数字
    for (int i = 1; i < arr.length; i++) {
        int currentNumber = arr[i];
        int j = i - 1;
        // 寻找插入位置的过程中,不断地将比 currentNumber 大的数字向后挪
        while (j >= 0 && currentNumber < arr[j]) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = currentNumber;
    }
}

法二与法一的区别在于:法一每次比较只要满足条件就进行交换,法二利用变量先将插入值保存,通过比较不进行交换,而是移动已有序的元素将插入位置腾出来,最后再将值插入。

插入排序也是稳定的,其时间复杂度也是O(n^2)。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值