您的位置:首页 > 职场人生

[剑指offer][面试题30]最小的k个数

2013-10-17 14:52 405 查看
输入n个整数,输出其中最小的K个数。例如,输入1、2、3、4、5、6、7、8这8个数字,则最小的4个数字为1、2、3、4。

#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}

int partition(int *piIn, int iLen, int iStart, int iEnd)
{
if (iStart>=iEnd){
return iStart;
}

int iSmall = iStart-1;
int iBig = iStart;
while (iBig<iEnd){
if (piIn[iBig]<piIn[iEnd]){
iSmall++;
swap(piIn[iSmall], piIn[iBig]);
}
iBig++;
}
iSmall++;
swap(piIn[iSmall], piIn[iEnd]);

return iSmall;
}

bool findLeastKNums(int *piIn, int iLenIn, int *piOut, int iK)
{
if (!piIn || !piOut || iLenIn<=0 || iK<=0 || iK>iLenIn){
return false;
}

int iStart = 0;
int iEnd   = iLenIn-1;
int iIndex = partition(piIn, iLenIn, 0, iLenIn-1);
while ( iIndex!=(iK-1) ){
if (iIndex>iK-1){
iEnd = iIndex-1;
iIndex = partition(piIn, iLenIn, 0, iEnd);
}
else{
iStart = iIndex+1;
iIndex = partition(piIn, iLenIn, iStart, iLenIn-1);
}
}

memcpy(piOut, piIn, iK*sizeof(int));
return true;
}

int main()
{
int data[8] = {4,5,1,6,2,7,3,8};
int out[8] = {0};

cout<<"\n Input:";
for (int i=0; i<8; i++){
cout<<data[i]<<" ";
}

for (int iK=1; iK<9; iK++){
findLeastKNums(data, 8, out, iK);
cout<<"\n iK="<<iK<<", Output:";
for (int i=0; i<iK; i++){
cout<<out[i]<<" ";
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: