前端-js-插入排序
阿新 • • 發佈:2020-10-10
插入排序,是分別取陣列中每一項元素,進行比較排序,依次插入到對應位置。
可從左向右比較,也可從右向左比較,下圖是從右向左比較示意。
程式碼實現有很多種方式,這邊提供了四種實現方式,可供參考
無差別統一插入,每次都從陣列左側(最小側)向右(最大側/未排序側)遍歷,遍歷次數因i增加逐漸增大,且每次都是完全遍歷,效率最低,會改變原陣列。
var a = [4,3,9,2,6,1,7,2] function insetSort(arr) { var index = 0 for (let i = 1; i < arr.length; i++) { index = i for (let j = i - 1; j >= 0; j--) { if (arr[j] > arr[i]) { index = j } } arr.splice(index, 0, arr[i]) // 插入元素的位置 arr.splice(i + 1, 1) // 從小到大排序,且i大於等於index,插入的元素原本在的位置後移一位 } } insetSort(a)
滿足條件插入,每次都從陣列左側(最小側)向右(最大側/未排序側)遍歷,遍歷次數因i增加逐漸增大,插入後即跳出迴圈,效率相對較低,會改變原陣列。
var a = [4,3,9,2,6,1,7,2] function insetSort2(arr) { for (let i = 1; i < arr.length; i++) { for (let j = 0; j < i; j++) { if (arr[j] > arr[i]) { arr.splice(j, 0, arr[i]) arr.splice(i + 1, 1) break } } } } insetSort2(a)
儲存排序後的新陣列(統一在內迴圈後插入),每次從排序後的新陣列左側向右遍歷比較,滿足條件跳出迴圈,效率較高,不改變原陣列
var b = [5,1,1,2,0,0] function insertSort3(nums) { var handle = []; // 使用新陣列,儲存排序後的陣列 for (let i = 0; i < nums.length; i++) { var index = 0 for(let j = 0; j < handle.length; j++){ index = j + 1 // 預設原陣列元素大,插入到新陣列元素的後面 if(nums[i]<handle[j]){ index = j break } } handle.splice(index, 0, nums[i]); // 原陣列和新陣列比較完成後,進行插入操作 } return handle } insertSort3(b)
儲存排序後的新陣列(使用標識判斷在內迴圈後是否還需插入),每次從排序後的新陣列左側向右遍歷比較,滿足條件跳出迴圈,效率較高,不改變原陣列
var b = [5,1,1,2,0,0]
function insertSort4(nums) {
var handle = [];
for (let i = 0; i < nums.length; i++) {
var flag = false // 預設沒有比該元素大的
for(let j = 0; j < handle.length; j++){
if(nums[i]<handle[j]){
handle.splice(j, 0, nums[i]); // 插入對應位置
flag = true // 存在比該元素大的
break
}
}
if (!flag) {
handle.push(nums[i]) // 如果沒有比該元素大的,則插入新陣列最後位置
}
}
return handle
}
insertSort4(b)
參考文章