冒泡排序:比較相鄰兩個項,若 第一個項 大於 第二個項,那麼交換他們,元素向上移動一次,直到遍歷結束。javascript
來實現一下java
function bubbleSort(arr) { // 提早存儲數組的長度 避免每次遍歷都讀這個值 let { length } = arr // 開始一個外層循環,表明每次取下標爲 i 的元素做爲第一項 for (let i = 0; i < length; i++) { // 開始一個內循環,表明每次取下標爲 j 的元素做爲第二項; 直至內循環迭代完,外循環迭代一次,再進入內循環迭代一輪, 首次跳過第一項 for (let j = 0; j < length - 1; j++) { // 內循環在迭代的過程當中,若發現有比下標爲 i 還小的元素 ,則對他們進行調換 if (arr[i] < arr[j]) { // let temp = arr[j] // arr[j] = arr[j + 1] // arr[j + 1] = temp //經典方式 es5 以前 👇 [arr[i], arr[j]] = [arr[j], arr[i]] // 這個是 es6以後 解構賦值寫法 } } } return arr } console.log(bubbleSort([11, 423, 534, 1223, 5345, 745, 73, 123])) // 輸出 [11, 73, 123, 423, 534, 745, 1223, 5345]
下面這個示意圖展現了改進後的冒泡排序算法是如何執行的。es6
注意,已經在正確位置上的數字沒有被比較。即使咱們作了這個小改變來改進冒泡排序算法,
但仍是不推薦該算法,它的複雜度是O(n2)。算法
選擇排序:選擇排序的思路大體是,找到數據結構中最小的,放到第一位;找到第二小的,放到第二位··· 以此類推
來實現一下選擇排序數組
function selectionSort(arr){ const {length} = arr let indexMin // 開始一個內循環,從第 i 個下標開始;因爲老是從 0 開始,**因此第一輪在尋找的是 最小的值,並要將找到的值放入第一位;此後的每輪都是再找 第 i 大的值 ,並放入第 i 位** for(let i = 0;i<length - 1; i++){ // 假設第 i 大的值爲 i ,並約定一個變量存儲 indexMin = i // 開始一個內循環,從第 i 個下標開始 for(let j = i; j < length; j++){ if(arr[i]>arr[j]){ // 若下標爲 i 的元素大於下標爲 j 的元素,那麼將** j **下標賦值給**約定的變量** indexMin = j } } // 結束一輪循環, 判斷下標i和indexMin是否爲相等 若不相等才進行交換;此舉能夠跳過第一個元素 與 第一個元素的比較 if(i !== indexMin){ [ arr[i],arr[indexMin] ] = [ arr[indexMin],arr[i] ] } } return arr } array = selectionSort([11, 423, 534, 1223, 5345, 745, 73, 123]) // 11,73,123,423,534,745,1223,5345 console.log(array.join())
下面的示意圖展現了選擇排序算法,以selectionSort([5, 4, 3, 2, 1])爲例子數據結構
另外推薦一個網站 能夠經過動圖來展現這個過程
https://visualgo.net/zh/sorting網站