快速排序
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)」