选择算法(Top K问题)
![]()
基于快排
//在快排中,选取某个数为基准,使该数的前面的数组元素全部大于该基准
//该数后面的数组元素全部小于该基准
int partSort(int *a, int left, int right)
{
if (nullptr == a)
return 0;
int key = a[right];
while (left < right)
{
while (left < right && a[left] <= key)
left++;
a[right] = a[left];
while (left < right && a[right] >= key)
right--;
a[left] = a[right];
}
a[right] = key;
return right;
}
int topK(int *a, int left, int right, int k)
{
if (nullptr == a)
return INT_MIN;
if (k > right - left)
return INT_MAX;
if (left == right)
return a[right];
int k_tmp = right - left - k + 1;//顺序排序,top K与索引值的转换
int partIndex = partSort(a, left, right);//返回值为部分排序中key的索引值,也是数组的第k大的数
while (partIndex != k_tmp)
{
if (partIndex > k_tmp)//说明第k大的数在[left,partIndex)
{
partIndex = partSort(a, left, partIndex - 1);
}
else//说明第k大的数在(partIndex,right)
{
partIndex = partSort(a, partIndex + 1, right);
}
}
return a[k_tmp];
}
基于堆(TODO)