面试:java 插入排序

**算法描述**

1. 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)

2. 重复以上步骤,直到整个数组有序

**算法实现**

    public static void main(String[] args) {
        int[] a = {9, 3, 7, 2, 5, 8, 1, 4};

        // i 代表待插入元素的索引
        for (int i = 1; i < a.length; i++) {
            int t = a[i]; // 代表待插入的元素值
            int j = i;
            System.out.println(j);
            while (j >= 1) {
                if (t < a[j - 1]) { // j-1 是上一个元素索引,如果 > t,后移
                    a[j] = a[j - 1];
                    j--;
                } else { // 如果 j-1 已经 <= t, 则 j 就是插入位置
                    break;
                }
            }
            a[j] = t;
            System.out.println(Arrays.toString(a));
        }
    }


控制台输出:
1
[3, 9, 7, 2, 5, 8, 1, 4]
2
[3, 7, 9, 2, 5, 8, 1, 4]
3
[2, 3, 7, 9, 5, 8, 1, 4]
4
[2, 3, 5, 7, 9, 8, 1, 4]
5
[2, 3, 5, 7, 8, 9, 1, 4]
6
[1, 2, 3, 5, 7, 8, 9, 4]
7
[1, 2, 3, 4, 5, 7, 8, 9]

**与选择排序比较**

1. 二者平均时间复杂度都是 $O(n^2)$

2. 大部分情况下,插入都略优于选择

3. 有序集合插入的时间复杂度为 $O(n)$

4. 插入属于稳定排序算法,而选择属于不稳定排序

**提示**

 *插入排序通常被轻视,其实它的地位非常重要。小数据量排序,都会优先选择插入排序*

面试题:数组18 23 19 9 23 15,使用选择插入算法,第三轮排序后的结果是

第一轮:18 23 19 9 23 15

第二轮:18 19 23 9 23 15

第三轮:9 18 19 23 23 15

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值