快排解决TopK问题 C++实现

面试中遇到的问题,挺有意思的记录一下。

C++版本

// 快排变形.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>

using namespace std;

int partion(vector<int>& nums,int left, int right)
{
    int key = nums[left];
    while (left < right)
    {
        while (left < right && nums[right] >= key) right--;
        nums[left] = nums[right];
        while (left < right && nums[left] <= key) left++;
        nums[right] = nums[left];
    }
    nums[left] = key;
    return left;
}

int topK(vector<int>& nums, int low, int high, int k)
{
    if (low == high) return nums[low];
    int pos = partion(nums, low, high);

    int len = high - pos + 1;
    if (len == k) return nums[pos];
    else if (len > k) return topK(nums, pos+1, high, k);
    else return topK(nums, low, pos -1, k-len);
}


int main()
{
    vector<int> nums = { 12,52,1,59,46,49,65,58,15,34,28,9,5 };
    int n = nums.size();
    cout << topK(nums, 0, n - 1, 3);
}
原文地址:https://www.cnblogs.com/BillowJ/p/14591106.html