#include <iostream>
#include <cstdlib>
//找出一个数组中的第k小元素
//启发于快速排序
template <typename T>
int sortQuick(T nums[], int low, int hight) {
//用随机主元的方式 降低最坏时间复杂度的可能
int index = rand() % (hight - low + 1) + low;
//[low,hight]
//主元置后
T temp = nums[index];
nums[index] = nums[hight];
nums[hight] = temp;
int i = low, j = hight;
while (i < j)
{
//找大
while (i < j && nums[i] <= temp)
{
i++;
}
if (i < j)
{
nums[j] = nums[i];
}
//找小
while (i < j && nums[j] >= temp)
{
j--;
}
if (i < j)
{
nums[i] = nums[j];
}
}
nums[j] = temp;
return j;//返回主元的位置
}
template <typename T>
T numsFindMaxK(T nums[],int low,int hight,int k)
{
int res = sortQuick(nums, low, hight);
if (k == res+1)
{
return nums[res];
}
else if (k>res)
{
numsFindMaxK(nums, res + 1, hight, k - (res - low + 1));
}
else
{
numsFindMaxK(nums, low, res - 1, k);
}
}
int main()
{
int nums[] = { 1,4,3,10,5,3,2,4,5,6,4 };
srand((unsigned int)time(0));
//
std::cout << numsFindMaxK<int>(nums, 0, 10, 7) << std::endl;
for (int i = 0; i < 11; i++)
{
std::cout << nums[i] << ' ';
}
}
次序选择问题-分治算法
最新推荐文章于 2024-07-19 19:11:19 发布