>[success] # 選擇排序法
[不錯的文章先讀一下](https://juejin.im/post/6844904167778041869#heading-0)
~~~
1..選擇排序大致的思路是找到數據結構中的最小值并 將其放置在第一位,接著找到第二小的值并將其放在第二位
2.可以理解成'選擇排序'將整個排序分成兩個區間,分別是'排序區間'和'未排序區間',選擇排序每次會從'未排序區間'中找到
最小的元素,將其放到已排序區間的末尾。
3.對引用圖進行說明一下,引用第一個圖中的第二組數據說明
'1 5 6 3 2 4',現在的1就是排序區間,'5 6 3 2 4' 就是為排序區間,這里要說圖雖然是 5 和 2 直接交換,但實際末尾的'4'
也是比較過了,只是圖上的效果感覺4沒有參與本次運算
~~~

* 這里引用一下王爭老師的圖

* js 算法結構的圖

>[info] ## 代碼實現
* 工具方法
~~~
// 生成隨機數數組
function randomArray(max, min, len) {
let randomNum = 0
const array = []
for (let i = 0; i < len; i++) {
randomNum = Math.floor((Math.random() * (max - min + 1)) + min)
array.push(randomNum)
}
return array
}
const array = randomArray(1, 10, 5)
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
EQUALS: 0
};
function defaultCompare(a, b) {
if (a === b) {
return Compare.EQUALS;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
// 交換數組中的位置
function swap(array, a, b) {
/* const temp = array[a];
array[a] = array[b];
array[b] = temp; */
[array[a], array[b]] = [array[b], array[a]];
}
~~~
>[danger] ##### 等價替換
~~~
1.想寫出選擇排序,給先知道一個思維邏輯'等價替換',現在有個小的需求,不用Math 方法,只是通過數組循環
來求出數組中最小值。
2.這類的思路就是,默認'某個值為最小值,但實際這個值可能真的就是最小值,也可能不是',我們用這個值依次去和其他
值比較,然后如果有比這個值還要小的值 ,那這個值就成為我們默認最小值。
~~~
~~~
// 等價替換法
function getArraryMin(array, compareFn = defaultCompare) {
const {
length
} = array
let min = array[0]
for (let i = 1; i < length; i++) {
// 默認 0 是最小的
if (compareFn(min, array[i]) === Compare.BIGGER_THAN) {
min = array[i]
}
}
return min
}
console.log(array)
console.log(Math.min(...array))
console.log(getArraryMin(array))
~~~
>[danger] ##### 代碼實現
~~~
1.這里有個思維轉換,當我們求一個數組中最小值和最大值的時候,我們用等價替換的方法,只是 循環了一次,
問題來了當我們要把數組中所有的都進行排序那單單的一次循環肯定不夠的,這時候就是雙層for 循環
2.這里還要注意的是'選擇排序'的概念,我們其實會將整個數組分成兩個區域,'排序區間'和'未排序區間',其中'排序區間'
是在數組前半部分,因此已經排序過的地方肯定是不需要在進行排序因此第二層的循環條件也變成了'let j = i; j < length; j++'
~~~
~~~
// 選擇排序
function selectionSort(array, compareFn = defaultCompare) {
const {
length
} = array
let indexMin
for (let i = 0; i < length-1; i++) {
// 等價替換
indexMin = i
for (let j = i; j < length; j++) {
if (compareFn(array[indexMin], array[j]) === Compare.BIGGER_THAN) {
indexMin = j
}
}
if (i !== indexMin) {
swap(array, i, indexMin)
}
}
return array
}
console.log(selectionSort(array))
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構