Insertion sort 插入排序法
Insertion sort 插入排序法
複雜度
複雜度 | Big O |
---|---|
最差時間複雜度 Worst-case time complexity | Big O(n^2) |
平均時間複雜度 Average-case time complexity | Big theta (n^2) |
最佳時間複雜度 Best-case time complexity | Big omega (n) |
空間複雜度 Space complexity | Big O (1) |
演算法
1. 確保檢查元素的左方是排序好的陣列
將陣列切割為左右兩方,左方確保一定是排序好的陣列
所以右方的陣列會取第一個數字,與左方陣列最大(最右方)數字做比較
若數字較小,則會繼續往左方移動比較,直到數字左方沒有任何數字小於本身數字就停止
2. 繼續取右方剩餘數字與左方排序好的數字陣列做比較
3. 持續這個步驟,將剩餘的陣列元素做比較
持續地將最小元素比較放左方正確順序的位置,最後就可以得到已排序的陣列
程式
JavaScript
function insertionSort(sortNumberList) {
for (var checkNumberIndex = 1; checkNumberIndex < sortNumberList.length; checkNumberIndex++) {
// 從第 2 個數字開始檢查比較
for (var insertNumberIndex = checkNumberIndex - 1; insertNumberIndex > -1; insertNumberIndex--) {
// 從要插入的數字持續向左半部分比較,較小的數字持續交換移動到左方
// 取得要插入數字位置的左右比較數字
var leftNumber = sortNumberList[insertNumberIndex];
var rightNumber = sortNumberList[insertNumberIndex + 1];
if (leftNumber > rightNumber) {
// 當「左方數字」比「右方數字」大,將兩個數字交換,大的數字放在右方
[sortNumberList[insertNumberIndex+1],sortNumberList[insertNumberIndex]] = [sortNumberList[insertNumberIndex],sortNumberList[insertNumberIndex + 1]];
}
}
}
;
return sortNumberList;
}
console.log(insertionSort([23, 1, 10, 5, 2]));
TypeScript
function insertionSort(sortNumberList: number[]){
for(let checkNumberIndex = 1; checkNumberIndex < sortNumberList.length;checkNumberIndex++){
// 從第 2 個數字開始檢查比較
for(let insertNumberIndex = checkNumberIndex - 1; insertNumberIndex > -1; insertNumberIndex--){
// 從要插入的數字持續向左半部分比較,較小的數字持續交換移動到左方
// 取得要插入數字位置的左右比較數字
let leftNumber = sortNumberList[insertNumberIndex];
let rightNumber = sortNumberList[insertNumberIndex + 1];
if(leftNumber > rightNumber){
// 當「左方數字」比「右方數字」大,將兩個數字交換,大的數字放在右方
[sortNumberList[insertNumberIndex+1],sortNumberList[insertNumberIndex]] = [sortNumberList[insertNumberIndex],sortNumberList[insertNumberIndex + 1]];
}
}
};
return sortNumberList;
}
console.log(insertionSort([23, 1, 10, 5, 2]));