排序算法之插入排序-数组版

先说原理:从一个无序数组中找到第一个无序数将他插入到合适的位置。然后重复这个动作。直到数组排好序。
涉及到的操作:
1.找到第一个无序元素。
2.将他插入到正确位置。
好,下面来具体分析一下实现方法:
1.对于第一个操作,我们需要一个索引来指示第一个无序元素的位置,我们可以从数组的第二个元素开始遍历,当发现这个元素值小于前一位上的元素之,就把这个索引值记录下来,用来表示这个元素要插入的位置,并把这个元素的值也保存下来,因为后面需要挪动前面的元素到这个位置。
2.对于插入操作,我们先把找到的元素值记录下来,上一步已做,然后把前一个值挪动到这里,把保存的索引值减一,完成一次挪动;然后再用保存的值和前面的值来比较,如果小于前一个值,继续上面的挪动......,当遇到不小于前面的值的时候,这时的位置就是他要插入的位置了。
看了上面的纯文字,有没有晕,没关系,总之一句话:比较,挪动,插入,完事。

下面到了上代码的时间了:

下面到了上代码的时间了:

 图片
下面来分析一下时间复杂度:假设list.length = n;
在上面的方法中
1.
loc = firstOfIndex; 执行n次 O(n);
2.if里面的语句取决于无序元素的多少,假设是k(<=n),那么
    temp = list[loc];  list[loc] = temp;执行2k次,O(k);
    do中的两句,取决于元素的正确位置与当前位置的距离,设为m(<=n) 执行2m次
    那么总共是 2k + k*2m=2k(1+m) 如果k=n, m =n ;就达到了O(n^2)当然只是最坏的情况,平均情况是k=n/2, m=n/2, 依然是O(n^2)。
综上时间复杂度为O(n),当大多数元素已经排好序时,比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值