1. 程式人生 > >js 排序

js 排序

book i++ 常熟 null 輸出 插入 並且 倒序 什麽

1、簡易桶排序

// 待排序的數組
var arr = [8, 5,5,3,2]
// 排序後的數組
var arr2 = []
// 桶容器,它的容量是由待排序數組中的最大值+1決定的
var book = new Array(Math.max.apply(null, arr) + 1);

// 初始化桶(m)
for (var i = 0; i < book.length; i++) {
    book[i] = 0
}

// 往桶中插入flag(n)
arr.forEach(function (e, i) {
    book[e]++
})

// 循環桶並且查看flag。打印出桶的當前索引並且放入arr2中(m)
book.forEach(function (e, index) { // 循環桶的flag數量,並且將當前桶的索引放入數組中(n) for (var i = 0; i < +e; i++) { arr2.push(index) } }) // 輸出排序後的數組 console.log(arr2) /* 該排序方法名為:簡易桶排序 時間復雜度的計算公式: O(m+n+m+n) = O(2*(m+m)) 時間復雜度可以忽略較小的常熟 O(m+n) 通常大寫更有逼格 O(M+N) */

2、冒泡排序

// 待排序的數組
var arr = [8, 5,5,3,2]

// 最外部的循環其實沒什麽參與什麽作為。 // 至於為什麽要-1 其實很容易理解。因為最後一次的時候是不需要與自己比較的。所以繞過了 // 當然你減不減好像也沒什麽區別。只是減少次數來優化罷了 for (var i = 0;i < arr.length - 1; i++) { // 重點想清楚這裏為什麽要-i。其實也很簡單,每一次輪回,都會把最大(小)數塞到最後。 // 所以下次就不必去比較最後一位了。同理,你減不減都無所謂。只是優化而已。但這個優化的幅度比較大 for (var j = 0; j < arr.length - i; j++) { // 這裏的比大小判斷決定排序是倒序還是正序
if (arr[j] > arr[j+1]) { // 以下代碼只是普通的交換變量邏輯。沒什麽好說的。 // 如果真要說的話,只能說無論臨時變量存儲的是j的值還是j + 1的值都是可以的 var temp = arr[j + 1] arr[j + 1] = arr[j] arr[j] = temp } } } console.log(arr) /* 該排序法名為:冒泡排序法 思路而言幾乎沒有難點,人人都能理解。但真要動手寫的時候,卻總有寫不出或者想不出的情況。 原因就在於沒有多寫,寫完也要看看套路。 雙重循環,以及那些可有可無的-1 和 -i 以及註意外層的循環沒有參與計算的作為。只有內存的j循環進行了比較或交換而已 */

js 排序