zoukankan      html  css  js  c++  java
  • 【拿下算法】:快速排序

    实现面试中最常问到的快速排序。

    一、基本思想

    • 在一组数组中,选取一个基准元素
    • 将所有小于等于基准的元素都放到左边新数组,将大于基准的元素都放到右边新数组
    • 对左边新数组和右边新数组重复前两部,知道数组只剩一个元素

    二、思想重现

    现在有数组[12, 2 , 13, 23, 4, 45], 分步骤执行

    • 第一步
      选择基准元素13
    • 第二步
      将小于等于13的放入左侧数组,大于13放入右侧数组,得到
      [12, 2, 4] (13) [23, 45]
    • 第三步
      对左右两个数组重复第一步和第二部,知道数组只有一个元素。
      (2) [12, 4] 13 (23) [45]
      2 [4] (12) 13 23 45
      2 4 12 13 23 45

    三、代码实现

    • 定义quickSort函数,接受一个数组作为参数。
    function quickSort(arr) {
    }
    
    • 对参数类型进行判断
    function quickSort(arr) {
      if ( !Array.isArray(arr)) {
      throw new Error('参数类型错误,请传入数组')
        return
      }
    }
    
    • 检查数组元素个数,小于等于1,则返回原数组。
    function quickSort(arr) {
      if ( !Array.isArray(arr)) {
      throw new Error('参数类型错误,请传入数组')
        return
      }
    
      if (arr.length <= 1) {
        return arr
      }
    }
    
    • 选择基准元素,然后定义左侧数组和右侧数组
    function quickSort(arr) {
      if ( !Array.isArray(arr)) {
      throw new Error('参数类型错误,请传入数组')
        return
      }
    
      if (arr.length <= 1) {
        return arr
      }
    
      const middleNum = arr.splice(Math.floor(arr.length /2), 1)[0]
    
      const left = [],
            right = [];
    }
    
    • 遍历数组,将小于等于基准的元素放入left数组,大于基准的元素放入right数组。
    function quickSort(arr) {
      if ( !Array.isArray(arr)) {
      throw new Error('参数类型错误,请传入数组')
        return
      }
    
      if (arr.length <= 1) {
        return arr
      }
    
      const middleNum = arr.splice(Math.floor(arr.length /2), 1)[0]
    
      const left = [],
            right = [];
    
      for (let i = 0; i < arr.length; i++) {
        if (arr[i] <= middleNum) {
          left.push(arr[i])
        } else {
          right.push(arr[i])
        }
      }
    }
    
    • 递归重复第一步和第二步,最终的到排序后的数组。
    function quickSort(arr) {
      if ( !Array.isArray(arr)) {
        throw new Error('参数类型错误,请传入数组')
        return
      }
    
      if (arr.length <= 1) {
        return arr
      }
    
      const middleNum = arr.splice(Math.floor(arr.length / 2), 1)[0]
    
      const left = [],
            right = [];
    
      for (let i = 0; i < arr.length; i++) {
        if (arr[i] <= middleNum) {
          left.push(arr[i])
        } else {
          right.push(arr[i])
        }
      }
    
      return quickSort(left).concat([middleNum], quickSort(right))
    }
    

    四、技术点

    数组方法请移步:Javascript对象之【Array】

    • Math
    • splcie
    • concat
    • 递归
  • 相关阅读:
    复利计算- 结对
    《构建之法》第4章读后感
    复利计算--单元测试
    实验一 命令解释程序的编写实验
    Scrum 项目准备4.0
    Scrum 项目准备3.0
    scrum 项目准备2.0
    【操作系统】实验三 进程调度模拟程序
    scrum 项目准备1.0
    Scrum团队成立
  • 原文地址:https://www.cnblogs.com/huiwenhua/p/13589786.html
Copyright © 2011-2022 走看看