最小的K个数(分割)
size_t Partition(vector<int> &arr, size_t left, size_t right)
{
int data=arr[left];
while(left<right)
{
while(left<right&&data<=arr[right]) right--;
arr[left]=arr[right];
while(left<right&&data>arr[left]) left++;
arr[right]=arr[left];
}
arr[left]=data;
return left;
}
void FindMinK(vector<int> &arr, size_t k)
{
assert(k>0&&arr.size()>k);
size_t left, right, mind;
for(left=0,right=arr.size()-1;left<right;)
{
mind = Partition(arr, left, right);
if(mind==k) return;
mind < k?(left=mind+1):(right=mind-1);
}
}
最小的K个数(堆)
void HeapAdjust(vector<int> &arr, size_t start)
{
int tmp=arr[start];
size_t child=2*start+1;
size_t end=arr.size()-1;
while(child <= end)
{
if(child<end && arr[child]<arr[child+1]) child++;
if(arr[child]>tmp)
{
arr[start]=arr[child];
start=child;
child=2*start+1;
}
else
break;
}
arr[start] = tmp;
}
void FindMinK(vector<int> &arr, vector<int>& bigHeap, size_t k)
{
assert(arr.size() > k && k > 0);
bigHeap.resize(k);
for (int i = 0; i < bigHeap.size(); i++)
{
bigHeap[i] = arr[i];
}
for(int i=bigHeap.size()/2;i>=0;i--)
{
HeapAdjust(bigHeap, i);
}
for (int i = bigHeap.size(); i < arr.size(); i++)
{
if (bigHeap[0] > arr[i])
{
bigHeap[0] = arr[i];
HeapAdjust(bigHeap, 0);
}
}
}