JS 面试题:排序算法(详细注释理解版)

248 阅读1分钟

快速排序

let quickSort = arr => {
    // 只有一个元素时直接 return
    if (arr.length <= 1) {return arr;}
    // 取得中心基准的下标
    // 代码意思是比如 7/2 是3余1,.floor 即只取 3
    let pivotIndex = Math.floor(arr.length / 2); 
    // 把基准元素取出
    let pivot = arr.splice(pivotIndex, 1)[0];
    // 装左边的数组
    let left = [] ; 
    // 装右边的数组
    let right = [] ; 
    // 遍历取出基准后的数组
    for ( let i = 0; i < arr.length; i++){
        if(arr[i] < pivot){
        // 小于基准元素的放在左边的数组
            left.push(arr[i]) 
        } else{
        // 大于基准元素的放在右边的数组
            right.push(arr[i])
        }
    }
    // 返回结果,左边继续排序(递归)+基准元素+右边继续排序(递归)
    return quickSort(left).concat([pivot], quickSort(right))
}

//验证
let arr = [1,3,4,62,3,44,55,632];
var a = quickSort(arr);
console.log(a);  // [1, 3, 3, 4,44, 55, 62, 632]

计数排序

let countSort = arr =>{
  // 声明一个哈希表为空对象
  // 数组中最大值 max 初始值为0
  // result 为空数组用来存放排好序的数组
  let hashTable = {}, max = 0, result = [] ;
  // 遍历未排序的数组中的元素
  for(let i=0; i<arr.length; i++){ 
        // 如果当前元素不存在哈希表
        if( !(arr[i] in hashTable) ){ 
            // 把当前元素存进哈希表,值记为 1
            hashTable[arr[i]] = 1
        }else{
            // 如果当前元素已在哈希表,给原来哈希表中该元素的值加上 1
            hashTable[arr[i]] += 1
        }
        // 如果当前元素比 max 大,就把该元素赋值给 max
        if(arr[i] > max) {max = arr[i]}
  }
  // 遍历已经记录好的哈希表
  for(let j=0; j<=max; j++){ 
        // 如果 j 自增到对应的哈希表中的 key,比如 12,即 12 in hashTable
        if( j in hashTable ){
            // 比如 hashTable[12],假设其在哈希表中key为 12 的值为 2,即 i < 2
            for(let i = 0; i<hashTable[j]; i++){
            // i = 0,push 一次 12,自增到 i = 1,再 push 一次 12
                result.push(j)
            }
        }
   }
   return result
}

// 验证
let arr=[1,3,4,62,3,44,55,632];
var a=countSort(arr);
console.log(a);  // [1, 3, 3, 4,44, 55, 62, 632]