//思路:使用快速排序的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;
}原文:http://blog.csdn.net/huai1693838234/article/details/44907817