排序算法--直接插入排序

一.算法描述

插入排序和选择排序一样,也是一种简单而又易于理解的排序算法。人们整理一副打乱了顺序的扑克牌的方法通常是先从牌堆里取出一张,然后再将其放入一个已经有序的序列中,我们可以将无序的数组a[n]想象成这样一副打乱了顺序的扑克牌。排序过程中,数组分为有序与无序两个部分,具体步骤如下:

  1. 先取出1个元素a[1],将其与a[0]比较大小并排序,当前的有序序列即为a[0]-a[1];
  2. 再从无序序列中取出1个元素,将其与当前有序序列的最后一位进行比较,如果比最后一位小的话再依次向小的方向比较,直到将其插入到合适的位置。在这个过程中如果遇到相同的元元素,则插入到该元素的后面;
  3. 循环第2步的操作,直到将所有元素插入到合适的位置。在这个过程中,如果该元素插入的位置是在已经有序的部分之内,则将比它大的部分全部向后移动一位。

直接插入排序


二.算法特性

1.时间复杂度

最好情况:O(n)
最坏情况:O(n²)
平均情况:O(n²)

在最好的情况下(即所有元素均已有序时),只需要对数组进行n-1次循环,此时的时间复杂度取决于数组的长度,所以时间复杂度为O(n)。
在最坏的情况下(即所有元素均为逆序时),需要对数组进行n(n-1)/2次循环,此时的时间复杂度为O(n²)。

2.空间复杂度

O(1)

插入排序只需要存储那个取出之后等待插入的元素,所以不论数组的长度如何,其所需要的额外空间都是不变的。

3.稳定性

稳定

由于在比较的时候,是从有序部分的右端开始比较,在遇到相同元素的时候直接将其放在这个相同元素的后边,所以插入排序是稳定的。


三.算法实现

//直接插入排序
public void insertionSort(Object[] a) {
    for(int i = 1; i < a.length; i ++) {
        for(int j = i; j > 0 && a[j] < a[j - 1]; j --) 
            exch(a, j - 1, j); //交换a[j-1]与a[j]的位置
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值