昨天,閒下來看了下冒泡排序與快速排序的區別。
兩者區別還是挺大,思路完全不一樣。
我們先看冒泡排序,冒泡是通過比較相鄰兩個元素的大小來調換順序,循環下去。代碼如下
// 冒泡排序
function bubble(arr) {
let n = 0
for (var i = arr.length - 1; i >= 0; i--) {
let change = false
for (var j = 0; j < i ; j ++){
n++
if (arr[j] > arr[j+1]){
let a = arr[j+1]
arr[j+1] = arr[j]
arr[j] = a
change = true
}
}
// 優化,減少循環次數
if (!change){
break
}
}
console.log(n) //循環次數
return arr
}
再看快速排序,我覺得也可以叫二分法排序,這是一種通過遞歸將數組分兩邊的排序方法。先取中間元素a[a.length/2], 比較中間元素與每一個元素的大小,比他大的push到一個數組中,小的push到另一個數組中,然後遞歸下去,代碼如下
// 快速排序
var num = 0 // 總的循環次數
function quick(arr){
if(arr.length<=1){
return arr
}
let n = 0 //每次函數調用的循環次數
let midIndex = Math.floor(arr.length/2)
let mid = arr.splice(midIndex,1)
let left = []
let right = []
for (var i = 0; i < arr.length; i++) {
n++
if (arr[i]>midIndex) {
right.push(arr[i])
} else {
left.push(arr[i])
}
}
console.log(n)
num += n
return quick(left).concat(mid,quick(right))
}
下面我們通過 一個數組去測試兩者的效率,爲了體現區別,我們的數組長度多一點
let arr = [23, 34, 54,12, 34, 3, 4, 13, 29, 89, 223, 33, 45, 665, 335, 7, 17, 90, 40]
放入上面兩個函數中,冒泡排序中n的值是161,快速排序中 num 的值是126
由此可見,兩者差別還是挺大,如果數組長度是100,那效率就差很多了。所以推薦大家遇到排序問題,儘量用快速,不僅逼格高,效率還槓槓的