昨天,闲下来看了下冒泡排序与快速排序的区别。
两者区别还是挺大,思路完全不一样。
我们先看冒泡排序,冒泡是通过比较相邻两个元素的大小来调换顺序,循环下去。代码如下
// 冒泡排序
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,那效率就差很多了。所以推荐大家遇到排序问题,尽量用快速,不仅逼格高,效率还杠杠的