假设在C编程语言中为您提供了以下函数声明。
int partition(int a[], int n);
该函数将
C编程语言中的以下部分给定函数用于使用分区函数查找大小为n的数组
int kth_smallest (int a[], int n, int k)
{
int left_end = partition (a, n);
if (left_end+1==k) {
return a[left_end];
}
if (left_end+1 > k) {
return kth_smallest (___________);
} else {
return kth_smallest (___________);
}
}
缺少的参数列表分别是
和
和
和
我在这里找到了一个很好的解释,关于“如何在一个长度为n的未排序数组中找到第k个最大的元素?”
我已经阅读了快速排序中使用的分区。答案是选项(1)。我同意答案。但我需要正式的解释。
你能解释一下吗?
编辑:AFAIK,分区算法将选择的枢轴放在正确的位置。我们需要递归分区算法来寻找数组中的第k个最小元素,分区算法运行在数组的单侧,可以是它的排序枢轴的左侧,也可以是它的排序枢轴的右侧。我被困在这里了。我在想,这取决于第k个指数?
很简单。例如,您选择数组中最大的一个
编辑:
向代码中添加注释:
int partition(int a[], int n); //breaks array into 2 parts, according to pivot (1st element of array), left is smaller and right is larger han pivot.
现在,你的递归算法:
int kth_smallest (int a[], int n, int k)
{
int left_end = partition (a, n); //get index of a[0] in sorted array a
if (left_end+1==k) { //kth largest element found
return a[left_end];
}
if (left_end+1 > k) { //k th largest element in left part of array, and is k th largest in the left part
return kth_smallest (___________);
} else { ////k th largest element in right part of array, and is (k - left_end) th largest in the right part
return kth_smallest (___________);
}
}