剑指offer——40.最小的k个数

/*
*@剑指offer 
*@40.最小的k个数 
*@edited by ryunin
*@date:2019/04/26
// 面试题40:最小的k个数
// 题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8
// 这8个数字,则最小的4个数字是1、2、3、4。
*/
#include 
using namespace std;

class Solution {
public:
	int partition(vector& array, int low, int high) //以最后一个数字作为partition的值 
	{
		int ptr = low - 1;
		int less = low; 
		int more = high;//这里需要定义三个指针,more可以不定义,但less必须,因为直接操作low,会影响low的值 
		while(less <= more)
		{
			if(array[less] <= array[more])
			{
				swap(array[less],array[ptr + 1]);
				ptr++;
			}
			less++;
		}
		return ptr;
	}
	
	void swap(int &i, int &j)
	{
		int temp = i;
		i = j;
		j = temp;
	}	
	
	void GetLeastNumbers(vector& input, int k)
	{
		int low = 0;
		int high = input.size() - 1;
		int index = partition(input,low,high);
		while(index != k-1)
		{
			if(index < k-1)
			{
				index = partition(input,index + 1,high);
			}
			if(index > k-1)
			{
				index = partition(input,low,index - 1);
			}
		}
		for(int i = 0;i v1 = {1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,2,3,2,2,2,5,4,2,0,0};
	Solution().GetLeastNumbers(v1,10);
	return 0;
	
}

你可能感兴趣的:(剑指offer)