剑指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;ireturn 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;indexif(data[index]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;  
        }  
};

你可能感兴趣的:(Algorithms,and,Data,Structures,C++,剑指offer解题详解)