js插入排序

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。

动态演示

代码实现

let array = randomArray(1, 100);
console.log(array);
let sortArray = insertionSort(array);
console.log(sortArray);
            
function insertionSort(array) {
   for (let begin = 1;begin < array.length;begin++) {
       let current = begin;
       while(current > 0 && array[current] < array[current - 1]){
           [array[current], array[current - 1]] = [array[current - 1], array[current]];
              current--
       }
    }
    return array;
}
function randomArray(start,end){
    var a=[],o={},random,step=end-start;
    while(a.length<step){
       random=start+parseInt(Math.random()*step);
       if(!o["x"+random]){
           a.push(random);
           o["x"+random]=1;
          };
    };
    return a;
};

运行结果

 

 

 优化一

//插入排序优化一  移位,减少交换值的操作
function insertionSort1(array) {
    for (let begin = 1;begin < array.length;begin++) {
    let cur = begin;
    let v = array[cur];
    while(cur > 0 && v < array[cur -1]){
        array[cur] = array[cur - 1];
        cur--;
    }
    array[cur] = v;
    }
    return array;
}

优化二

//插入排序优化二  通过二分法
function insertionSort2(array) {
    for (let i = 0;i < array.length;i++) {
        let insertIndex = search(array, i);
        let cur = array[i];
    for (let j = i;j > insertIndex;j--) {
        array[j] = array[j-1];
    }
    array[insertIndex] = cur;
    }
}
//查找要插入的index值
function search(array, index) { let begin = 0; let end = index; while(begin < end) { let mid = (begin + end) >> 1; if(array[index] < array[mid]) { end = mid; }else{ begin = mid + 1; } } return begin; }

 

posted on 2020-10-23 16:05  ming1025  阅读(211)  评论(0编辑  收藏  举报