排序算法-插入排序和时间复杂度

插入排序的原理就和打扑克牌一样,比如打扑克牌开始时给你发了5张牌,刚开始这五张牌没有整理是乱序的,那么这个时候你就先拿起一张牌默认为有序的(因为只有一张),之后再拿起第二张和前面的一张进行对比小的放前面大的放后面,之后再拿起第三张和前面两张进行比较按照从小到大的顺序找到合适的位置插入进去,一直循环直到没有牌需要插入。这就是插入排序的一个简单原理。在代码实现过程中就是按照这样的一个思路来走的,只是代码比较笨拙在进行每一次寻找插入位置时都需要和前面的元素一一进行比较将前面的比较大的元素像后移最后自己插在中间合适的空闲处。

如果还没有理解可以看看图,更容易理解
在这里插入图片描述
大致上就是这么一个过程,一直循环重复知道所有的顺序都排好。

下面是具体代码实现:

		/**
         * A.compareTo(B) > 0 表示A > B 返回大于零
         */
public void sort(Element[] elements) {
        for(int i = 1; i < elements.length; i++){
            Element temp = elements[i];
            int j = i;
            while(j > 0 && elements[j-1].compareTo(temp) > 0){
                elements[j] = elements[j - 1];
                j--;
            }
            if(j != i)
                elements[j] = temp;
        }
    }

时间复杂度:

			最好情况   最差情况

比较次数       n-1     2+3+4+...+n = (n*n+n-2)/2

移动次数        0       1+2+3+...+(n-1) = n*n/2

所以插入排序的时间复杂度
最坏情况:O(n*n) 最好情况O(n) 平均情况O(n *n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值