topK

选择算法(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)

posted @ 2018-10-16 10:58  Apotato  阅读(135)  评论(0)    收藏  举报