标签:partition
//思路:使用快速排序的patition函数来进行处理 时间复杂度为O(n)
#include<iostream>
#include<cassert>
using namespace std;
int partition(int *ar, int len, int low, int high)
{
	int temp = ar[low];
	while(low < high)
	{
		while(low < high && temp < ar[high])
		{
			high--;
		}
		if(low == high)
		{
			break;
		}
		else
		{
			ar[low] = ar[high];
		}
		while(low < high && temp > ar[low])
		{
			low++;
		}
		if(low == high)
		{
			break;
		}
		else
		{
			ar[high] = ar[low];
		}
	}
	ar[low] = temp;
	return low;
}
int findkmin(int *ar, int len, int k)//寻找第k小的数
{
	assert( (ar!=NULL) && (k>0) && (k<len+1) );
	int low = 0;
	int high = len - 1;
	int index = partition(ar, len, low, high);
	while(index != k-1)
	{
		if(index > k)
		{
			index = partition(ar, len, low, index-1);
		}
		else
		{
			index = partition(ar, len, index+1, high);
		}
	}
	return ar[index];
}
void findkmin(int *ar, int len, int k, int *retar)//寻找最小的k个数
{
	assert( (ar!=NULL) && (k>0) && (k<len+1) && (retar!=NULL));
	int low = 0;
	int high = len - 1;
	int index = partition(ar, len, low, high);
	
	while(index != k-1)
	{
		if(index > k)
		{
			index = partition(ar, len, low, index-1);
		}
		else
		{
			index = partition(ar, len, index+1, high);
		}
	}
	for(int i = 0; i<=index; ++i)
	{
		retar[i] = ar[i];
	}
}
void show(int *ar ,int len)
{
	for(int i=0; i<len; ++i)
	{
		cout<<ar[i]<<" ";
	}
	cout<<endl;
}
int main()
{
	int ar[] = {7,3,5,6,4,1,2};
	int retar[32];
	int len = sizeof(ar)/sizeof(ar[0]);
	int len2 = sizeof(retar)/sizeof(retar[0]);
	cout<<findkmin(ar, len, 7)<<endl;
	cout<<findkmin(ar, len, 1)<<endl;
	cout<<findkmin(ar, len, 5)<<endl;
	//cout<<findkmin(ar, len, 0)<<endl;
	//cout<<findkmin(ar, len, 8)<<endl;
	
	findkmin(ar, len, 7, retar);
	show(retar, 7);
	findkmin(ar, len, 1, retar);
	show(retar, 1);
	findkmin(ar, len, 5, retar);
	show(retar, 5);
	return 0;
}标签:partition
原文地址:http://blog.csdn.net/huai1693838234/article/details/44907817