ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

快排与TopK 问题

2020-11-27 20:04:28  阅读:226  来源: 互联网

标签:index right nums int 问题 快排 TopK array left


快排与TopK 问题都可以用partition解决,所以这里将两者放在一起进行总结

topK 问题

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Solution{
    public:
        int partition (int left, int right, vector<int>& nums){
            int index = left;
            int key = nums[right];
            for(int i = left; i <= right; i++){
                if (nums[i] > key){
                    swap(nums[index++], nums[i]);
                }
            }
            // cout<< "ss"<<index<<endl;
            swap(nums[index], nums[right]);
            return index; //  返回一个索引,这个索引前面的数字都比他大
            // 注意啊这个index 返回值可以是[left, right]
        } 
        void top_k( int left, int right, vector<int>& nums, int k ){
            int index = partition(left, right, nums);
            if (index == k){
                return;
            }else if (index > k){ // index 太大了 
                top_k(left, index-1 ,nums,k);
            }else{
                top_k(index+1, right, nums, k);
            }
        }

        vector<int> top_k (vector<int>& nums,int k){ // 这些从参数对问题规模的描述不是很贴切
            int left = 0, right = nums.size()-1;
            top_k(left, right, nums, k);
            vector<int> res;
            for(int i = 0; i < k; i++){
                res.push_back(nums[i]);
            }
            return res;
        }   
};

int main(){
    vector<int> array = {1,2,3,2,3,1,2,3,4};
    Solution ss;
    ss.partition(0, array.size()-1,array);
    for(auto& arr : array){
        cout<< arr <<"    ";
    }
    cout<<endl;
    vector<int> res = ss.top_k(array, 5);
    int n = res.size();
    for(int i = 0; i < n;i++){
        cout<< res[i]<<"  ";
    }
    system("pause");
}

快排

#include<vector>
#include<iostream>
using namespace std;
class Solution{
    public:
        vector<int> array_sort(vector<int>& nums){
            int left = 0,  right = nums.size()-1;
            quick_sort(left, right, nums);
            return nums;
        }
        void quick_sort(int left, int right, vector<int>& nums){
            if (left >= right)
                return;
            int key = nums[left];
            int index = left;
            for(int i = left+1; i <= right; i++){
                if (nums[i] >= key){
                    swap(nums[i], nums[++left]);
                }
            }
            swap(nums[left] , nums[index]);
            quick_sort(index,  left-1, nums);
            quick_sort(left+1,  right, nums);
        }

        // void quick_sort(int left, int right, vector<int>& nums){
        //     if (left >= right)
        //         return;
        //     int key = nums[right];
        //     int index = right;
        //     for(int i = right-1; i >= left; i--){
        //         if (nums[i] >= key){
        //             swap(nums[i], nums[--right]);
        //         }
        //     }
        //     swap(nums[right] , nums[index]);
        //     quick_sort(left,  right-1, nums);
        //     quick_sort(right+1,  index, nums);
        // } 
};

int main(){
    vector<int> array = { 1,2,3,5,2,2,4,7,3,4,4,7,5};
    Solution ss;
    ss.array_sort(array);
    int n = array.size();
    for(int i = 0; i < n;i++){
        cout<< array[i]<<"  ";
    }
    system("pause");
}

标签:index,right,nums,int,问题,快排,TopK,array,left
来源: https://www.cnblogs.com/wsl-hitsz/p/13932674.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有