插入排序
一、原理
☆思想:和打牌起牌过程类似,第一张牌拿在手里,起第二张牌,和第一张比较,放到它的左右,起第三张牌,和前两张比较,放到它们中间或左右,以此类推,手里的牌一直是有序的;每次起一张新牌,和现有牌比较,插入合适位置,直到拿到所有牌,最终得到有序序列;
☆过程:以递增为例,用数组表示,长度为n,整个数组为无序集合;首元素自然有序,不处理;从第二个元素开始循环,记录其元素值为基准值,依次和其前元素循环比较,如果小于则该元素后移一位,直到找到一个不小于基准值的元素,把基准值放到其后;
二、实现代码
JavaScript 代码实现
function InsertSort(arr) { var curr, preIndex; for (var i = 1; i < arr.length; i++) { //新插入元素i暂存 curr = arr[i]; //循环其前元素 preIndex = i - 1; while (curr < arr[preIndex] && preIndex >= 0) { //比新元素大的元素后移 arr[preIndex + 1] = arr[preIndex]; preIndex--; } //插入到最后一个移动元素的位置 arr[preIndex + 1] = curr; console.log(i + ':' + arr); } }
三、优化
无;
四、复杂度
| 名称 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
| 平均 | 最坏 | 最优 | |||
| 插入排序 | O(n²) | O(n²) | O(n) | O(1) |
√ |
最差情况,数组反序,首元素不需要处理,第二个元素,需要1次比较,…最后一个元素,需要进行n-1次比较,共需要1+2+3+……+(n-1)=n(n-1)/2次比较;
最优情况,数组正序,首元素不需要处理,第二个元素,需要1次比较,…最后一个元素,需要进行1次比较,共需要1+1+1+……+1=n-1次比较;
本排序需要申请一个额外空间;
使用数组表示,相同元素顺序不变化,本排序稳定。

浙公网安备 33010602011771号