/*=================================================================*\
100-5:查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
\*=================================================================*/
#include <iostream>
#define N 9
using namespace std;
int partition(int *index,int begin,int end){
int i = begin;
int j = end;
int temp;
while (i < j)
{
while(index[i] < index[j]){
--j;
}
if (i < j)
{
temp = index[i];
index[i] = index[j];
index[j] = temp;
}
while (index[i] < index[j])
{
++i;
}
if(i < j){
temp = index[i];
index[i] = index[j];
index[j] = temp;
}
}
return i;
}
void printIndex(int *index){
for(int i = 0; i < N ; ++i){
cout << index[i] << " ";
}
cout << endl;
}
void quickSort(int *index,int begin,int end){//快速排序
if (begin < end)
{
int k = partition(index,begin,end);
quickSort(index,begin,k);
quickSort(index,k+1,end);
}
}
int quickFind(int *index,int begin,int end,int i){//快速查找前i个元素
if(begin < end){
int k = partition(index,begin,end);
//cout << i << "<" << k << ": ";
//printIndex(index);
int pIndex = k+1;
if (i == pIndex){
return k;
}else if(i < pIndex){
return quickFind(index,begin,k-1,i);
}else if(i > pIndex){
return quickFind(index,k+1,end,i);
}
}else if (begin == end){
return begin;
}
}
int main(){
int index[N] = {2,6,1,3,5,9,7,8,4};//测试数据
int k = quickFind(index,0,8,4);//找前4个小的数
//cout << k << endl;
for(int i = 0;i <= k ; ++i){
cout << index[i] << " ";
}
}