插入排序

核心思想

插入排序是一种通过移动整个数组来交换元素的算法
假设有N个元素,那么它由N-1趟排序组成。
它基于这样的事实: 它将数组分成两个部分,第0~ P-1 个元素是有序的,第P到N-1是无序的。
每一趟排序,我们选择第P个位置的元素,即右边部分取出一个数放到0-~P-1中的一个正确位置。
我们比较这个元素和第0~P-1的元素,在一个循环中一个一个比较,比它大的就后移,遇到比它小的就跳出循环就把这个元素放到比它小的数的后面:

实现算法

思考步骤:
1. 数组划分两个部分
2. P从1到N-1,选择P位置的元素
3. 比较第P个元素和前面0~P-1个元素,有必要就移动
4. 交换tmp和第j个元素(循环结束后的j)

public void insertionSort(int[] A){
    if(A==null||A.length<1)
        return;
    int len=A.length;
    int j;
    for(int P;P<len;P++){
        int tmp=A[P];
        for(j=P;j>0&&A[j-1]>tmp;j--){
            A[j]=A[j-1];
        }
        A[j]=tmp;
    }
}

性能分析

时间复杂度

最坏 O(N^2)
最好 O(N) ,最好情况就是所有元素都是有序的,那么插入排序中的内部循环就永远不满足判断条件,所以不会移动元素。
实际为:

tmp=A[P];
A[j]=tmp; //j其实就是P,因为没有进入循环

平均复杂度:
O(N^2)

空间复杂度

O(1) 没有使用额外的空间。

稳定性

稳定的, 因为每次比较的是遇到比它小的才交换位置,而且其实是数组整体往后移动来交换。 跟它的值一样的元素与它的相对顺序必然是保持不变的。

举例 {3,4,5,12,5}
排序后:
{3,4,5,5,12}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值