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
    • 递归
  • 相关阅读:
    Java网络编程
    loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)
    bzoj4241: 历史研究(回滚莫队)
    洛谷P5050 【模板】多项式多点求值
    loj#6053. 简单的函数(Min_25筛)
    【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
    51nod 1781 Pinball(线段树)
    CF1110D Jongmah
    CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
    20. Valid Parentheses
  • 原文地址:https://www.cnblogs.com/huiwenhua/p/13589786.html
Copyright © 2011-2022 走看看