排序算法之——插入排序分析

前言

最简单的排序算法之一是插入排序(insertion sort)。

思路

插入排序的思路是这样的:

插入排序。由N-1趟排序完成,对于i=1到N-1趟,保证从位置0到位置i上的元素为已排序状态(但不保证已排序的值一定小于未排序的值)。

过程:

  • 对于位置i,先把i位置的值保存起来,然后把i挖空。
  • 依次与前一个位置比较,比较i-1到0位置上的元素;
  • 若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位;
  • 最后将tmp填入空位

整个过程就是一个不停的往前插的过程,因此叫插入排序

我们对数列:[2, 12, 6, 15, 8] 进行插入排序

在这里插入图片描述
其中,i=1和i=3趟都没发生交换。

代码

/**
 * 插入排序。由N-1趟排序完成,对于i=1到N-1趟,保证从位置0到位置i上的元素为已排序状态(
 * 但不保证已排序的值一定小于未排序的值)。
 * <p>
 * 过程:对于位置i,先把i位置的值保存起来,然后把i挖空。
 * 依次与前一个位置比较,比较i-1到0位置上的元素;
 * 若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位;
 * 最后将tmp填入空位
 *
 * 整个过程就是一个不停的往前插的过程,因此叫插入排序
 *
 * @param a
 * @param <E>
 */
public static <E extends Comparable<? super E>> void insertionSort(E[] a) {
    int j;
    for (int i = 1; i < a.length; i++) {
        E tmp = a[i];//对于位置i,先把i位置对应的值保存起来,然后把i挖空
        for (j = i; j > 0 && tmp.compareTo(a[j - 1]) < 0 ; j--) {
            a[j] = a[j - 1];//若发现i对应的值小于某个位置的值,则将该位置的值往后移动一位;
        }
        a[j] = tmp;//最后将tmp填入空位
    }
}

复杂度和稳定性

  • 时间复杂度
    假设被排序的数列中有N个数。遍历一趟的时间复杂度是 O ( N ) O(N) O(N),需要遍历多少次呢?N-1次,因此,插入排序的时间复杂度是 O ( N 2 ) O(N^2) O(N2)

  • 插入排序稳定性
    直接插入排序是稳定的算法,它满足稳定算法的定义。
    算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愤怒的可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值