早教吧作业答案频道 -->其他-->
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小数…...的网友还看了以下:
小红买一只1.4元的铅笔,以下哪个方案不合理a.给收营员2.4元,找回1元b.给收营员1.7元,找 2020-05-13 …
设R 和S 分别是r和 s元关系,且 R有n个元组,S有m个元组。执行关系R和 S的笛卡儿积,记为 2020-05-23 …
小虹买一本科技书,付给营业员20元,找回18.32元,小虹发现营业员多找给她15.12元小虹买一本 2020-06-06 …
设二元可微函数F(x,y)在直角坐标系中F(x,y)=f(x)+g(y)在极坐标中可写为F(x,y 2020-06-13 …
如图,某电信公司推出两种不同的收费标准:A种方式是月租20元,B种方式是月租0元,一个月本地网内打 2020-06-27 …
一道编程题,输入一个3╳4的数组,先找出每一行中的最大元素,再分别除该行中的所有元素,最后输出数组 2020-06-28 …
(2010•浦东新区一模)已知函数f(x),如果存在给定的实数对(a,b),使得f(a+x)•f( 2020-06-29 …
某电信公司推出两种手机收费方式:A种方式是月租20元,B种方式是月租0元.一个月的本地网内打出电话 2020-07-19 …
1.已知函数f(x),如果存在给定的实数对(a,b),使得f(a+x)*f(a-x)=b恒成立,则 2020-08-03 …
微积分问题已知函数导数和函数值,找此函数(内详)找函数y=f(x).在定义域(-π/2,π/2)的导 2020-12-28 …