原理: 當i=0,首先找到最小的元素放在起始的位置,而後i=1,再而後找到最小的元素放到最左i=1的位置,而後i=2,...前端
動畫演示git
const SelectSort = arr => { if (arr == null || arr.length < 2) { return } for (let i = 0; i < arr.length-1; i++) { let minIndex = i for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex=j } } if (minIndex !== i) { swap(arr, i, minIndex) } } return arr } const swap = (arr, i, j) => { arr[i] = arr[i] ^ arr[j] arr[j] = arr[i] ^ arr[j] arr[i] = arr[i] ^ arr[j] } let arr = [1, 2, 10, 3, 4, 5, 6] console.log(SelectSort(arr))
const InsertSort = arr => { if (arr == null || arr.length < 2) { return } for (let i = 1; i < arr.length; i++) { for (let j = i-1;j>=0&&arr[j]>arr[j+1];j--) { swap(arr,j,j+1) } } return arr } const swap = (arr, i, j) => { arr[i] = arr[i] ^ arr[j] arr[j] = arr[i] ^ arr[j] arr[i] = arr[i] ^ arr[j] } let arr = [1, 2, 10, 3, 4, 5, 6] console.log(InsertSort(arr))
動畫數組
邏輯解釋動畫
首先,講數字分割成兩份區域,在講數字分割成兩份區域,只到每塊區域只有一個元素(這個過程是遞歸過程)code
const mergeSort=array=>{ if(array.length<2) return array; let mid = Math.floor(array.length / 2) let left = array.slice(0, mid); let right = array.slice(mid); return merge(mergeSort(left), mergeSort(right)) } 舉例說明入棧 [9, 3,4,5, 10,9, 6, 4] [9, 3,4,5] | [10,9,6, 4] [9,3] | [4,5] | [10,9] | [6,4] [9] [3]|[4] [5] |[10][9] | [6] [4]截下來,講分割的每塊區域進行合併組合blog
[9] [3]|[4] [5] |[10][9] | [6] [4] 出棧 [3,9]|[4,5] |[9,10]|[4,6] [3,4][5,9] [3,4,5,9] | [4,6,9,10] //left[0]<arr[0] const merge=(left,right)=>{ let result=[]; while (left.length > 0 && right.length > 0) { if (left[0] < right[0]) { result.push(left.shift()) }else{ result.push(right.shift()) } } /*把長度不同的鏈接起來*/ return result.concat(left).concat(right) }
計數排序排序
動畫遞歸
邏輯get
- 計算出數組中的最大值
- 創建最大值加一的數組且數組中每個數爲0
- 新的數組進行值得累積
- 下面的打下斷點就懂了
const bucketSort = arr => { if (arr == null || arr.length < 2) { return arr } let max = Math.max(...arr) let bucket = Array.from({length: max + 1}, v => 0) let oArr = [] for (let i = 0; i < arr.length; i++) { //值得累積 bucket[arr[i]]++ } for (let i = 0; i < bucket.length; i++) { while (bucket[i]-- > 0) { oArr.push(i) } } return oArr } console.log(bucketSort([10, 9, 7, 6, 3]))
動畫it
//獲取每位的數字位數 const getDigit = (x, d) => { let a = Math.pow(10, d) return Math.floor(x / a) % 10 } const radixSort=(arr)=> { //最大位數 let maxDigit = String(Math.max(...arr)).length let counter = [] for (let i = 0; i < maxDigit; i++) { for (let j = 0; j < arr.length; j++) { let bucket = getDigit(arr[j], i) if (counter[bucket] == null) { counter[bucket] = [] } counter[bucket].push(arr[j]) } let pos = 0 for (let j = 0; j < counter.length; j++) { let value = null if (counter[j] != null) { while ((value = counter[j].shift()) != null) { arr[pos++] = value } } } } return arr } let arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] console.log(radixSort(arr, 2)) //[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]本身修改版(不知道會不會寫錯,由於我本身寫錯了,因此仍是改爲前端看起來比較順眼的)
//獲取每位的數字位數 const getDigit = (x, d) => { let a = Math.pow(10, d) return Math.floor(x / a) % 10 } const radixSort = (arr) => { let maxDigit = String(Math.max(...arr)).length let counter = Array.from({length: 10}, () => []) for (let i = 0; i < maxDigit; i++) { for (let j = 0; j < arr.length; j++) { let a = getDigit(arr[j], i) counter[a].push(arr[j]) } let b=0; counter.forEach(val=>{ while (val.length > 0) { arr[b++]=val.shift() } }) } return arr } let arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] console.log(radixSort(arr)) //[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................