這是我參與8月更文挑戰的第十天,活動詳情查看:8月更文挑戰」算法
昨天也就是上一章咱們聊了算法,以及比較經典的算法之冒泡排序,今天咱們接下來要介紹一下選擇排序和插入排序。數組
選擇排序
和冒泡排序同樣,性能相較下不是很好,可是實現簡單。markdown
找到數組中的最小值,選中它並將其放置在第一位。app
接着找到第二小的值,選中它並將其放置在第二位。oop
以此類推,執行 N - 1 輪,完成排序。post
如上動畫:性能
紅色就是當前循環中的最小元素。動畫
綠色就是當前循環所在的元素。ui
黃色就是排序好的元素。this
選擇排序動畫(visualgo.net/zh/sorting)
代碼以下:
Array.prototype.selectionSort = function () {
for (let i = 0; i < this.length - 1; i++) {
let indexMin = i
for (let j = i; j < this.length; j++) {
if (this[j] < this[indexMin]) {
indexMin = j
}
}
if (indexMin !== i) {
const temp = this[i]
this[i] = this[indexMin]
this[indexMin] = temp
}
}
}
const arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
arr.selectionSort()
console.log(arr);
// [
2, 3, 4, 5, 15, 19,
26, 27, 36, 38, 44, 46,
47, 48, 50
]
複製代碼
兩個嵌套循環。
時間複雜度:O(n^2)。
插入排序和冒泡排序,選擇排序的複雜度是同樣的,可是在排序一些小型數組的時候,插入排序是更勝一籌的了。
從第二個數開始往前比。
比它大就日後排。
以此類推動行到最後一個數。
插入排序動畫(visualgo.net/zh/sorting)
紅色就是拿出來的元素。
綠色就是當前比對的元素。
黃色就是排序好的元素。
Array.prototype.insertionSort = function () {
for (let i = 1; i < this.length; i++) {
const temp = this[i]
let j = i
while (j > 0) {
if (this[j - 1] > temp) {
this[j] = this[j - 1]
} else {
break
}
j--
}
this[j] = temp
}
}
const arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
arr.insertionSort()
console.log(arr);
//[
2, 3, 4, 5, 15, 19,
26, 27, 36, 38, 44, 46,
47, 48, 50
]
複製代碼
兩個嵌套循環。
時間複雜度:O(n^2)。
End~~~