排序算法(JS实现)

130 阅读1分钟

所谓排序算法,是将数据递增或递减排序。大致分为两类:比较排序和非比较排序。比较排序是很容易理解,其中冒泡排序、选择排序、插入排序都很简单;快速排序相对复杂一点,有递归和非递归两种实现思路,这里只考虑递归的快速排序算法。

冒泡排序

// 冒泡排序
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)]
  }

其它排序算法的比较

2.png