js插入排序
阿新 • • 發佈:2020-10-23
一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:
- 從第一個元素開始,該元素可以認為已經被排序;
- 取出下一個元素,在已經排序的元素序列中從後向前掃描;
- 如果該元素(已排序)大於新元素,將該元素移到下一位置;
- 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
- 將新元素插入到該位置後;
- 重複步驟2~5。
動態演示
程式碼實現
let array = randomArray(1, 100); console.log(array); let sortArray = insertionSort(array); console.log(sortArray); functioninsertionSort(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; }