早教吧作业答案频道 -->其他-->
c++快排思想查找第k小数……注意是小RT给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。这是一个补充程序的试题,你需要完成一个函数:intfindKth(int*s,intn,
题目详情
c++ 快排思想查找第k小数……注意是小
RT
给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。
这是一个补充程序的试题,你需要完成一个函数:
int findKth(int *s, int n, int K)
表示在s指向的数组中找到第K小的元素(如果K=1,表示找最小元素),你需要返回该元素的值。
RT
给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。
这是一个补充程序的试题,你需要完成一个函数:
int findKth(int *s, int n, int K)
表示在s指向的数组中找到第K小的元素(如果K=1,表示找最小元素),你需要返回该元素的值。
▼优质解答
答案和解析
可以通过改写快速排序算法解决
一趟排序划分出基准位置pivot
1. pivot == k - 1,则pivot 位置数据就是
2. pivot > k - 1,则在左半继续寻找
3. pivot < k - 1,则在右半继续寻找
以下是程序:
int select(int s[ ], int left, int right, int k)
{ // 在s[ left .. right ]中选择第k 小的元素
if (left >= right)
return s[left];
int i = left; // 从左至右的标志
int j = right + 1; // 从右到左的标志
int pivot = s[left]; // 将最左面的元素作为分界数据
while (true)
{
do
{ // 在左侧寻找>= pivot 的元素
i = i + 1;
} while (s[i] < pivot);
do
{ // 在右侧寻找<= pivot 的元素
j = j - 1;
} while (s[j] > pivot);
if (i >= j) // 未发现交换对象
break;
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
if (j - left + 1 == k)
return pivot;
s[left] = s[j]; // 设置pivot
s[j] = pivot;
if (j - left + 1 < k) // 对一个段递归
return select(s, j + 1, right, k - j - 1 + left);
else
return select(s, left, j - 1, k);
}
int findKth(int *s, int n, int K)
{ // 返回 s[0 .. n - 1]中第K 小的元素
if (K < 1 || K > n)
throw "error";
return select(s, 0, n - 1, K);
}
一趟排序划分出基准位置pivot
1. pivot == k - 1,则pivot 位置数据就是
2. pivot > k - 1,则在左半继续寻找
3. pivot < k - 1,则在右半继续寻找
以下是程序:
int select(int s[ ], int left, int right, int k)
{ // 在s[ left .. right ]中选择第k 小的元素
if (left >= right)
return s[left];
int i = left; // 从左至右的标志
int j = right + 1; // 从右到左的标志
int pivot = s[left]; // 将最左面的元素作为分界数据
while (true)
{
do
{ // 在左侧寻找>= pivot 的元素
i = i + 1;
} while (s[i] < pivot);
do
{ // 在右侧寻找<= pivot 的元素
j = j - 1;
} while (s[j] > pivot);
if (i >= j) // 未发现交换对象
break;
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
if (j - left + 1 == k)
return pivot;
s[left] = s[j]; // 设置pivot
s[j] = pivot;
if (j - left + 1 < k) // 对一个段递归
return select(s, j + 1, right, k - j - 1 + left);
else
return select(s, left, j - 1, k);
}
int findKth(int *s, int n, int K)
{ // 返回 s[0 .. n - 1]中第K 小的元素
if (K < 1 || K > n)
throw "error";
return select(s, 0, n - 1, K);
}
看了 c++快排思想查找第k小数…...的网友还看了以下:
已知反比例函数>=k/x(k≠0)和和y2=-x已知反比例函数y1=k/x(k≠0)和一次函数y2 2020-04-08 …
,已知a,b关于x的一元二次方程kx2+(k-3)x+k+3=0的两个实数根,其中k为非负整数,点 2020-04-26 …
函数题,快啊,已知一次函数y=(3-k)x-2k的平方+18.1K为何值时,图像过原点.2若Y随X 2020-05-13 …
初二题快一点哈已知k=(a+b-c)/c=(a-b+c)/b=(-a+b+c)/a已知k=(a+b 2020-05-13 …
高一数学,求过程已知一次函数y=x+k(k∈R)的图像已知一次函数y=x+k(k∈R)的图像与二次 2020-05-14 …
已知函数y=(k+1)x+k²-1(1)求当k取何值时,它是一次函数,(2)当k取何值时,已知函数 2020-07-18 …
快速计算一次函数、二次函数各常数项的方法。初中数学。比如一次函数:y=kx+b,即给定两个坐标点, 2020-07-25 …
关于函数y=(k-3)x+k,给出下列结论①当k≠3时,此函数是一次函数;关于函数y=(k-3)x 2020-07-25 …
c++快排思想查找第k小数……注意是小RT给定一个大小为n的数组s和一个整数K,请找出数组中的第K 2020-07-29 …
9x²-6x+1=?要求因式分解,已知一次函数y=(k+2分之1)x的k²+k-1方(k为整数)① 2020-08-03 …