题目
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
code
快速排序
var getLeastNumbers = function (arr, k) {
if (k > arr.length) return [];
heap_sort(arr, arr.length);
return arr.slice(0, k);
}
最大堆
/**
* @param {number[]} arr
* @param {number} k
* @return {number[]}
*/
var getLeastNumbers = function (arr, k) {
if (k > arr.length) return [];
let res = arr.slice(0, k);
create_heap(res, k); // 建最大堆
for (let i=k; i<arr.length; i++){
if (res[0] > arr[i]){
let temp = res[0];
res[0] = arr[i];
arr[i] = temp;
heapify(res, k, 0);
}
}
heap_sort(res, k); // 对k个元素进行排序
return res;
}
function swap(tree, i, j) {
let temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
function heapify(tree, n, i) {
if (i >= n) return;
let left = i * 2 + 1;
let right = i * 2 + 2;
let max = i;
if (left < n && tree[max] < tree[left]) {
max = left;
}
if (right < n && tree[max] < tree[right]) {
max = right;
}
if (max != i) {
swap(tree, max, i);
heapify(tree, n, max);
}
}
function create_heap(tree, n) {
let last_node = n - 1;
let parent = Math.floor((n - 1) / 2);
for (let i = parent; i >= 0; i--) {
heapify(tree, n, i);
}
}
function heap_sort(tree, n) {
//create_heap(tree, n);
for (let i = n - 1; i >= 0; i--) {
swap(tree, 0, i);
heapify(tree, i, 0);
}
}
基于快速排序的查找
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function (nums, k) {
return partition(nums, 0, nums.length-1, nums.length-k);
};
const partition = function (arr, ll, rr, k) {
if (ll >= rr) return arr[ll];
let left = ll;
let right = rr;
let pivot = arr[left];
while (left < right) {
while (left < right && arr[right] >= pivot) { // 注意要等于=
right--;
}
if (left < right) {
arr[left] = arr[right];
}
while (left < right && arr[left] <= pivot) {
left++;
}
if (left < right) {
arr[right] = arr[left];
}
if (left >= right) {
arr[left] = pivot;
}
}
if (left == k) {
return arr[left];
} else if (left < k) {
return partition(arr, left+1, rr, k);
} else {
return partition(arr, ll, left-1, k);
}
}