剑指Offer(40)最小的k个数

题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

  • 算法:快速(分组)排序
  • 数据结构:数组
  • 编程语言:C++
class Solution {
public:
    vector<int> result;
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        if(input.size()<=0||k<=0|k>input.size())//输入合理性
            return result;
        int length=input.size();
        int start=0;
        int end=length-1;
        int index=Partition(input,length,start,end);//获取起始位置的合理坐标,右边都比它大
        while(index!=k-1)//第k个元素
        {
            if(index>k-1)//在k的右侧
            {
                end=index-1;
                index=Partition(input,length,start,end);
            }
            else//在k的左侧
            {
                start=index+1;
                index=Partition(input,length,start,end);
            }
        }
        for(int i=0;i<k;i++)
           result.push_back(input[i]);
            return result;
    }

   //重点是&,该函数用于把获取start的位置
    int Partition(vector<int> &data,int length,int start,int end)
    {
        if(data.size()==0||end>=length||start<0)
            return -1;
        int index=start;
         Swap(&data[index],&data[end]);

        int small=start-1;
        for(int index=start;index<end;++index)
        {
            if(data[index]<data[end])
            {
                ++small;
                if(small!=index)
                    Swap(&data[index],&data[small]);
            }
        }
        ++small;
        Swap(&data[small],&data[end]);

        return small;
    }
       int RandomInRange(int start ,int end)  
       {  
           if(end>start)  
           {  
             srand(time(NULL));// srand函数是随机数发生器的初始化函数,使得随机数种子随时间的变化而变化  
             return start+rand() %((end-start));//产生start~end之间的随机数  
           }  
           return 0;  
       }
    //交换
    void Swap(int *a,int *b)  
        {  
            int temp;  
            temp=*a;  
            *a=*b;  
            *b=temp;  
        }  
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值