早教吧作业答案频道 -->其他-->
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小数…...的网友还看了以下:
关于W=FS的问题W=FS,我对这个S很疑惑.一个斜面,某人将木箱装在重为50N的小车将它从斜面底端 2020-03-31 …
请问What'sname'slet's这3个单词后面都加了个('s),请问这个('s)代表的是什么 2020-05-14 …
表示年后面加个s算什么?如1800s,Inthelate1800sandearly1900s.如果 2020-06-14 …
S4N4中S和N的化合价是多少为什么S4N4是由S2Cl2NH3合成的4个S排成正四面体结构4个N 2020-06-23 …
向一个带头结点,栈顶指针为top的链栈中插入一个*s结点的时候,应当执行语句是()A.top->n 2020-06-28 …
S8和P4的分子中都只有共价单键,若P4分子中有6个P-P键,则可推断S8分子有个S-S键;己知: 2020-07-14 …
公式计算的问题.例子:重力加速1G中的9.81m/s^2,这个s为什么要加上方程积"^2",这会影 2020-07-17 …
用NA表示阿伏加德罗常数的值,下列叙述中正确的是()A.0.5mol雄黄(As4S4,结构如图)含有 2020-12-29 …
一个很简答的拉普拉斯变换数学问题请问,t[u(t)-u(t-a)],是如何计算出3个函数的,这个式子 2020-12-31 …
有一些单词,比如result,这个s是发浊音的,但像insist,这个s是发清音的.是不是除了在re 2021-01-12 …