排序算法——快速排序

146 阅读1分钟

快速排序

let quickSort = function(arr){
  //递归出口就是数组长度为1
  if(arr.length <= 1)return arr
  //获取中间值的索引,使用Math.floor向下取整
  let index = Math.floor(arr.length / 2)
  //使用splice截取中间值,第一个参数为截取的索引,第二个参数为截取的长度
  //如果此处使用pivat = arr[index],会出现无限递归错误
  //splice 影响原数组
  //比如 A = [1,3,2,1]
  //使用 res = A.aplice(2,1)后 
  //A = [1,3,1] 下标为2的数被剔除掉了
  //而 res = [2] ,所以使用[0]返回一个数字
  
  let pivot = arr.splice(index,1)[0],
      left  = [],
      right = [];
  console.log(pivot)
  console.log(arr)
  for(let i = 0;i < arr.length;i++){
    if(pivot > arr[i]){
      left.push(arr[i])
    }else{
      right.push(arr[i])
    }
  }
  //使用ES6的重构会清晰一些
  return [...quickSort(left),pivot,...quickSort(right)]
}
let arr = [2,0,9,7,0,4,4]
console.log(quickSort(arr))

题目

215. 数组中的第K个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

 

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2

输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4

输出: 4

 

提示:

1 <= k <= nums.length <= 104

-104 <= nums[i] <= 104

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/kt…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    //使用快速排序,22点45分,但是我好像不太懂    
    //看了天天up的快速排序后,明白了
    //开始23点07分
    //首先来一个递归
    let shenru = (arr) => {
        //差点忘了递归结束条件
        if(arr.length <= 1)return arr
        //向下取整
        let index = Math.floor(arr.length / 2)
        //找到最中间的数
        let mid = arr.splice(index,1)[0]
        let left = []
        let right = []
        for(let i = 0;i < arr.length;i++){
            let tem = arr[i]
            if(tem < mid){
                left.push(tem)
            }else{
                right.push(tem)
            }
        }
        return [...shenru(left),mid,...shenru(right)]
    }
    nums = shenru(nums)
    return nums[nums.length - k]
    //23点18分
};

「时间复杂度:O(nlogn)」