26.最小的K个数:快排应用

最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
这道题不复杂,写出快排就算成功了。关键是快排要写对啊。
快排中
while (i - j <= 0)
不能写成
while (i - j < 0)
中值的计算
int pivot = vec[(l + r) / 2];
不能写成
int pivot = vec[vec.size() / 2];

// 27.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
using namespace::std;

class Solution {
public:
	vector<int> GetLeastNumbers_Solution(vector<int> vec, int k) {
		vector<int> retVec;
		if (vec.empty() || k < 0 || k > vec.size()) return retVec;
		QuickSort(vec, 0, vec.size() - 1);
		for (int i = 0; i < k; i++) {
			retVec.push_back(vec[i]);
		}
		return retVec;
	}

	void QuickSort(vector<int>& vec, int l, int r) {
		int i = l;
		int j = r;
		int pivot = vec[(l + r) / 2];
		while (i - j <= 0) {
			if (vec[i] < pivot) i++;
			else if (vec[j] > pivot) j--;
			else {
				int tmp = vec[i];
				vec[i] = vec[j];
				vec[j] = tmp;
				i++; j--;
			}
		}
		if (l < j)
			QuickSort(vec, l, j);
		if (i < r)
			QuickSort(vec, i, r);
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vec;

	vec.push_back(4);
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(6);
	vec.push_back(2);
	vec.push_back(7);
	vec.push_back(3);
	vec.push_back(8);

	Solution s;
	s.GetLeastNumbers_Solution(vec, 4);

	return 0;
}

第二次做:
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> retVec ;
        if ( input.empty() == true || k < 0 || input.size() < k ) return retVec ;
        
        QuickSort( input, 0, input.size() - 1 ) ;
        
        for ( int i = 0; i < k; ++ i ) {
            retVec.push_back( input[i] ) ;
        }
        
        return retVec ;
    }
    
    void QuickSort( vector<int>& vec, int l, int r ) {
        int i = l ;
        int j = r ;
        int pivot = vec[( i + j ) / 2] ;
        while ( i - j <= 0 ) {
            if ( vec[i] < pivot ) ++ i ;
            else if ( vec[j] > pivot ) -- j ;
            else {
                int tmp = vec[i] ;
                vec[i] = vec[j] ;
                vec[j] = tmp ;
                ++ i ;
                -- j ;
            }
        }
        if ( l < j ) QuickSort( vec, l, j ) ;
        if ( i < r ) QuickSort( vec, i, r ) ;
    }
};


第三次做:
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> retVec ;
        if ( input.empty() == true || k < 0 || k > input.size() ) return retVec ;
        
        QuickSort( input, 0, input.size() - 1 ) ;
        
        for ( int i = 0; i < k; ++ i ) {
            retVec.push_back( input[i] ) ;
        }
        
        return retVec ;
    }
    
    void QuickSort( vector<int>& vec, int left, int right ) {
        if ( vec.empty() ) return ;
        
        int i = left ;
        int j = right ;
        int pivot = vec[( i + j ) / 2] ;
        
        while ( i <= j ) {
            if ( vec[i] < pivot ) ++ i ;
            else if ( vec[j] > pivot) -- j ;
            else {
                int tmp = vec[i] ;
                vec[i] = vec[j] ;
                vec[j] = tmp ;
                ++ i ;
                -- j ;
            }
        }
        
        if ( left < j ) QuickSort( vec, left, j ) ;
        if ( i < right ) QuickSort( vec, i, right ) ;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值