插入排序
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法描述:
一般来说,插入排序都采用 in-place 在数组上实现:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
思路:
从无序区的第一个元素与前面有序区的元素进行比较
如果无序区的比前面的元素小 那么前面的元素往后面移动 两者交换位置 否则就将此元素插入到相应的位置
算法演示gif:
算法思路演示:
(1) 53 被认为是 已经排序的第一个 , 下一个元素是 27 , 遍历已经排序的数组 查找合适的位置 53 > 27 交换位置
(2) 已经排序好的是 27 53 下一个要排序的是 36 , 36 小于 53 交换位置 35 大于 27 不用交换位置 得到已经排序好的数组 27, 38 , 53
(3) 重复步骤
(4) 跳出里面循环后 执行外层循环 外层的+ 1
代码实现:
let arr = [53, 27, 36, 15, 69, 42 ]; InserSort(arr); console.log(InserSort(arr)) function InserSort (arr) { let length = arr.length; if (length<0) { return } for (let index = 0; index < length; index++) { let current = arr[index]; let preIndex = index - 1; while(preIndex>=0&¤t < arr[preIndex]) { arr[preIndex+1] = arr[preIndex] preIndex -- } arr[preIndex+1] = current } return arr }
里层循环的代码:
while(preIndex>=0&¤t < arr[preIndex]) { arr[preIndex+1] = arr[preIndex] preIndex -- } arr[preIndex+1] = current
外层循环 要 遍历 + 1 操作
git : https://gitee.com/guangzhou110/front-end-sorting-algorithm