当前位置: 代码迷 >> 综合 >> Topk快排实现
  详细解决方案

Topk快排实现

热度:107   发布时间:2023-10-02 03:39:25.0

简介

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行

  • 1.首先设定一个分界值,通过该分界值将数组分成左右两部分。

  • 2.将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

  • 3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

  • 4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

let quickTopK = function (arr, k) {
    if(k==0)return []if (arr.length < 2) return arrlet midValue = arr.splice(0, 1), left = [], right = []arr.forEach((el) => {
    el > midValue ? left.push(el) : right.push(el)});if (left.length == k) {
    return left} else if (left.length > k) {
    return quickTopK(left, k)} else {
    return left.concat(midValue, quickTopK(right, k - left.length - 1))}
}
console.log(quickTopK([6, 0, 1, 4, 9, 7, -3, 1, -4, -8, 4, -7, -3, 3, 2, -3, 9, 5, -4, 0], 8))
[ 9, 7, 9, 6, 5, 4, 4, 3]