所谓排序算法,是将数据递增或递减排序。大致分为两类:比较排序和非比较排序。比较排序是很容易理解,其中冒泡排序、选择排序、插入排序都很简单;快速排序相对复杂一点,有递归和非递归两种实现思路,这里只考虑递归的快速排序算法。
冒泡排序
// 冒泡排序
function sort(arr){
for(let i=0;i<arr.length;i++){
for(let j=0;j<arr.length;j++){
if(arr[i]<arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
return arr
}
插入排序
function sort(arr){
for(let i=0;i<arr.length;i++){
for(let j=0;j<i;j++){
if(arr[i]<arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
return arr
}
选择排序
function sort(arr){
for(let i=0;i<arr.length;i++){
let minIndex = i
for(let j=i+1;j<arr.length;j++){
if(arr[j]>arr[minIndex]) continue
minIndex = j
}
[arr[i],arr[minIndex]]=[arr[minIndex],arr[i]]
}
return arr
}
快速排序(递归)
function quickSort(arr) {
// 4.结束递归(当ary小于等于一项,则不用处理)
if (arr.length <= 1) return arr
// 1. 找一个基准点,可以是数组的任意一项,这里选中间项
const middle = arr.splice(Math.floor(arr.length / 2), 1)[0]
// 2. 准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组中,反之放到右边数组中
const leftArr = [], rightArr = []
for (let i = 0; i < arr.length; i++) {
const current = arr[i]
current < middle ? leftArr.push(current) : rightArr.push(current)
}
// 3. 递归方式让左右两边的数组持续这样处理,一直到左右两边都排好序为止。
return [...quickSort(leftArr),middle,...quickSort(rightArr)]
}
其它排序算法的比较