Java排序系列之插入排序

前言:
排序算法之插入排序
简介:
我们来学习下插入排序。其实排序的所有算法起的名字都还是很有标识性的。比如今天的插入排序,其实它的名字就已经很好的反应了该算法的原理了。简单描述一下该算法原理:对于一个待排序数组,我们假设第一个元素已经排序好了,剩下的元素都是待排序的元素。我们取待排序序列的第一个元素,将它按照顺序插入到前面的有序序列中,这样前面有序序列多了一个元素,且依然有序,待排序数组减少了一个元素。重复这个步骤,直到数组有序。
原理:
1)记录当前待插入的元素的值;
2)将该值从有序序列末尾挨个进行比较,如果当前元素小于比较元素,则比较元素后移一位;
3)如果该值大于或者等于比较元素,则将该值插入比较元素的后面;
4)重复以上步骤直到整个数组有序。
好了,俺又要去找图了:
在这里插入图片描述
这个还是挺容易理解的,接下来上Java代码:

int[] insertionSort(int[] arr){
    for(int i = 1;i < arr.length;i++){
        int temp = arr[i],index = i - 1;
        while(index >= 0 && temp < arr[index]){
            arr[index + 1] =arr[index];
            index--;
        }
        arr[index + 1] = temp;
    }
    return arr;
}

例行讨论,时间复杂度安排上:
最好情况:序列已经是升序,在这种情况下,需要进行的比较操作为(n-1)次;最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。赋值操作的次数是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。
当然了,该算法是稳定,因为如果存在相同的两个元素,第二个元素的插入也会在第一个元素之后,这是因为咱们代码里面while循环中的条件为temp < arr[index]。所以,如果我们要破坏它的稳定性的话,我们只需将判别条件改成小于等于就可以了,那么它的稳定性就被破坏了。
那不如优化一手?
折半插入排序(二分插入排序)算法,也就是该算法优化之后的名字,其实原理和之前的算法原理一样,原算法插入的时候使用的是从后往前一个一个比较,而优化后的算法,则是采用二分查找(折半查找)来确定要插入的位置,这样可以减少比较的次数,从而达到一定的优化。
总结:
插入排序时间复杂度为O(n^2),该排序算法是稳定的排序算法,当然,改变一下判断条件也可以破坏它的稳定性。
好了,插入排序就讲到这里,接下来会对其它的排序算法持续更新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值