NC119 最小的K个数
1.排序
直观的做法是,将整个数组排好序后,取数组前k个或最后k个数,但这种方法时间复杂度较高(O(n*log(n))),在数据量很大的情况不适用。
function GetLeastNumbers_Solution(input, k)
{
input.sort((a,b)=>{
return a-b;
})
return input.slice(0,k)
}
module.exports = {
GetLeastNumbers_Solution : GetLeastNumbers_Solution
};
方法二:快排思想
快速排序算法有两个核心点,分别为 “哨兵划分” 和 “递归” 。
哨兵划分操作: 以数组某个元素(一般选取首元素)为 基准数 ,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。
详细图解
递归: 对 左子数组 和 右子数组 递归执行 哨兵划分,直至子数组长度为 1 时终止递归,即可完成对整个数组的排序。
如下图所示,为示例数组 [2,4,1,0,3,5] 的快速排序流程。观察发现,快速排序和 二分法 的原理类似,都是以 \loglog 时间复杂度实现搜索区间缩小。
算法流程:
function GetLeastNumbers_Solution(input, k)
{
let len = input.length;
if(!len || !k) return [];
return quickSort(input,k,0,len-1)
}
var quickSort = function(arr,k,l,r){
var i = l,j = r;
while(i<j){
while(i<j && arr[j]>=arr[l]) j--;
while(i<j && arr[i]<=arr[l]) i++;
[arr[i],arr[j]]=[arr[j],arr[i]];
}
[arr[l],arr[i]]=[arr[i],arr[l]];
if (i>k) return quickSort(arr,k,l,i-1);
if (i<k) return quickSort(arr,k,i+1,r);
return arr.slice(0,k);
}
module.exports = {
GetLeastNumbers_Solution : GetLeastNumbers_Solution
};