求最小的k个数

来源:互联网 发布:oracle sql优化 编辑:程序博客网 时间:2024/05/01 10:31
class Solution {
public:
    int partition(int left,int right,vector<int> &nums)
     {
        //int left=0,right=len-1;
        while(left<right)
        {
          
            while(left<right&&nums[left]<=nums[right])
                right--;
            if(left<right) swap(nums[left],nums[right]);
            
            while(left<right&&nums[right]>=nums[left])
                left++;
            
            if(left<right) swap(nums[left],nums[right]);
               
        }
        return left;
    }
    
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
       
        vector<int>result;
        
        int len=input.size();
        if(len==0) return result;
        
        if(k>len) return result;
        if(k==0) return result;
        
        int mid=partition(0,len-1,input);  //先求出中间
       
        while(mid!=k-1)      //个数不满足的话
        {
        if(mid>k-1)
            {
            mid=partition(0,mid-1,input);     
            }
            else{
                mid=partition(mid+1,len-1,input);
            }
        }
         result.assign(input.begin(),input.begin()+k); // 不要和return连着写
        return result;
    }
    
    
    

};


下面是堆排序

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len=input.size();
        vector<int>result;
        if(len==0) return result;
        if(k>len) return result;
         input.insert(input.begin(),0);
       
        heapsort(len,input);
        result.assign(input.begin()+1,input.begin()+k+1);
        return result;
        
    }
    void sift(int i,int m,vector<int>&a)
    {
        int j=2*i;
        while(j<=m)
        {
           if(j<m&&a[j+1]>a[j]) j++;
            if(a[j]<=a[i]) break;
            else {
                swap(a[j],a[i]);
                i=j;
                j=2*i;
            }
        }
    }
    void heapsort(int n,vector<int>&a)
    {
       for(int i=n/2;i>=1;i--)
           sift(i,n,a);
        for(int i=1;i<n;i++)
           {    
            swap(a[1],a[n-i+1]);
            sift(1,n-i,a);
           }
    }
};


这个是用堆排序的思想做的;

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len=input.size();
        vector<int>result;
        if(len==0) return result;
        if(k>len) return result;
         input.insert(input.begin(),0);
        for(int i=k/2;i>=1;i--)
            sift(i,k,input);
        for(int i=k+1;i<=len;i++)
         {   
            if(input[i]<input[1]) {
            swap(input[i],input[1]);
            sift(1,k,input);
              }
          
         }  
        result.assign(input.begin()+1,input.begin()+k+1);
        return result;
            
        
    }
    void sift(int i,int m,vector<int>&a)
    {
        int j=2*i;
        while(j<=m)
        {
           if(j<m&&a[j+1]>a[j]) j++;
            if(a[j]<=a[i]) break;
            else {
                swap(a[j],a[i]);
                i=j;
                j=2*i;
            }
        }
    }
    void heapsort(int n,vector<int>&a)
    {
       for(int i=n/2;i>=1;i--)
           sift(i,n,a);
        for(int i=1;i<n;i++)
           {    
            swap(a[1],a[n-i+1]);
            sift(1,n-i,a);
           }
    }
};

0 0
原创粉丝点击