1. 程式人生 > 實用技巧 >js插入排序

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; }