6 volist双层数组_Javascript算法 — 数组排序
作為初級前端面試,一般算法問題考的不多,但是如果考算法的話,數組排序被問到的概率是非常大的,本文介紹幾種排序方案。
一、冒泡排序
最基本也是最經典的排序算法。利用雙層for循環,外層控制比較趟數,內層控制當前這一趟比較的次數,相鄰的兩個數互相比較,如果前一個數比后一個數大,那就直接交換,以此類推,每一趟比較都能確定當前的最大值,所以就會像冒泡一樣將比較大的數冒泡到最后,從而排好序。
| 1234567891011121314 | function sort1 (arr) { var len = arr.length for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j+1]) { var temp = arr[j+1] arr[j+1] = arr[j] arr[j] = temp } } } return arr}console.log(sort1([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
二、選擇排序
選擇排序相較冒泡排序沒有那么激進,選擇排序在比較的過程中只是記錄當前最小值所在的索引,一趟結束以后判斷最小值索引如果不是一開始假設的值,那就將最小索引所在的值交換到這一趟的最前面去,從而完成排序。
| 1234567891011121314151617 | function sort2 (arr) { for (var i = 0; i < arr.length - 1; i++) { var minIndex = i for (var j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j } } if (minIndex !== i) { var temp = arr[i] arr[i] = arr[minIndex] arr[minIndex] = temp } } return arr}console.log(sort2([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
三、快速排序
找一個基準值,將數組中比基準值小的放入左邊,比基準值大的放入右邊,然后將左右兩部分繼續找基準值再分成兩部分,依次遞歸下去,直到不能再拆分為止(數組length為1),就排好序了。
| 123456789101112131415161718 | function sort3 (arr) { if (arr.length <= 1) { return arr } var num = Math.floor(arr.length / 2) var centerVal = arr.splice(num, 1) var left = [] var right = [] for (var i = 0; i < arr.length; i++) { if (arr[i] < centerVal[0]) { left.push(arr[i]) }else{ right.push(arr[i]) } } return sort3(left).concat(centerVal, sort3(right)) }console.log(sort3([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
四、插入排序
依次往后遍歷,將遍歷到的數和前面的數從后往前依次比較,如果當前數比前面的某個數要大,那就說明當前數應該在的位置就是這個數的后面。
| 12345678910111213 | function sort4 (arr) { for (var i = 1; i < arr.length; i++) { var preIndex = i - 1 var current = arr[i] while (preIndex >= 0 && arr[preIndex] > current) { arr[preIndex + 1] = arr[preIndex] preIndex-- } arr[preIndex + 1] = current } return arr}console.log(sort4([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
五、希爾排序
插入排序的改進版,分組做插入排序。通過對增量gap的控制實現對分組的細化,最后完成排序。
| 1234567891011121314151617 | function sort5 (arr) { var gap = 1 while (gap < arr.length / 5) { gap = gap * 5 + 1 } for (; gap > 0; gap = Math.floor(gap / 5)) { for (var i = gap; i < arr.length; i++) { var temp = arr[i] for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) { arr[j + gap] = arr[j] } arr[j + gap] = temp } } return arr}console.log(sort5([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
六、堆排序
利用堆(一棵順序存儲的完全二叉樹)來完成堆數組的排序。
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | function sort6 (arr) { // 初始化大頂堆,從第一個非葉子結點開始 for (let i = Math.floor(arr.length / 2 - 1); i >= 0; i--) { adjustHeap(arr, i, arr.length) } // 排序,每一次for循環找出一個當前最大值,數組長度減一 for(let i = Math.floor(arr.length - 1); i > 0; i--) { // 根節點與最后一個節點交換 swap(arr, 0, i) // 從根節點開始調整,并且最后一個結點已經為當前最大值,不需要再參與比較,所以第三個參數為 i,即比較到最后一個結點前一個即可 adjustHeap(arr, 0, i) } return arr}// 交換兩個節點function swap(arr, i, j) { let temp = arr[i] arr[i] = arr[j] arr[j] = temp}// 將 i 結點以下的堆整理為大頂堆,注意這一步實現的基礎實際上是:// 假設 結點 i 以下的子堆已經是一個大頂堆,adjustheap 函數實現的// 功能是實際上是:找到 結點 i 在包括結點 i 的堆中的正確位置。后面// 將寫一個 for 循環,從第一個非葉子結點開始,對每一個非葉子結點// 都執行 adjustheap 操作,所以就滿足了結點 i 以下的子堆已經是一大頂堆function adjustHeap(arr, i, length) { // 當前父節點 let temp = arr[i] // j for(let j = 2 * i + 1; j < length; j = 2 * j + 1) { // 將 arr[i] 取出,整個過程相當于找到 arr[i] 應處于的位置 temp = arr[i] if(j+1 < length && arr[j] < arr[j+1]) { // 找到兩個孩子中較大的一個,再與父節點比較 j++ } // 如果父節點小于子節點:交換;否則跳出 if(temp < arr[j]) { swap(arr, i, j) // 交換后,temp 的下標變為 j i = j } else { break } }}console.log(sort6([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
七、sort
使用數組的API?sort實現排序。
| 1234 | function sort7 (arr) { return arr.sort((a, b) => a - b)}console.log(sort7([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32] |
代碼不是萬能的,但不寫代碼是萬萬不能的
2020/11/18?Dary記
相關推薦:
? ? Javascript算法 — 數組去重
? ??Javascript算法 — 數組扁平化
JavaScript內置對象 — Math數學對象
HTTP請求完整過程以及頭信息深入解析正則表達式防抖和節流總結
以上是生活随笔為你收集整理的6 volist双层数组_Javascript算法 — 数组排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php里面的socket编程,详解PHP
- 下一篇: MySQLdb._exceptions.