1.有人可以解释并阅读此代码吗?这是搜索第K个关键伪代码,看起来并不困难,但我很难理解这些代码行。特别是,我想让你分享你在partition()中的接近方式,我理解隐居功能是有效的,所以你不必解释选择功能,但如果你愿意,你可以这样做..(这是我的第一个问题如果我的问题含糊不清,请告诉我。)
keytype selection(index low, index high, index k) {
index pivotpoint;
if(low == high)
return s[low];
else {
partition(low, high, pivotpoint);
if (k == pivotpoint)
return s[pivotpoint];
else if (k < pivotpoint)
return selection(low, pivotpoint-1, k);
else
return selection(pivotpoint+1, high, k-pivotpoint);
}
}
void partition(index low, index high, index& pivotpoint) {
index i,j;
keytype pivotitem;
pivotitem = s[low];
j=low;
for (i = low+1; i <= high; i++)
if(s[i] < pivotitem) {
j++;
exchange s[i] and s[j];
}
pivotpoint = j;
exchange s[low] and s[pivotpoint];
}
答案 0 :(得分:0)
这是Quickselect算法。
partition
的想法是在s
和low
之间对数组high
中的元素进行分区,如下所示:
pivotitem
,在这种情况下是s[low]
。s
(从i=low+1
开始)并将所有小于pivotitem
的元素移动到数组的左侧部分(也从j=low+1
开始) s[low+1,...,j]
都小于pivotitem
,而s[j+1,...,high]
都大于或等于pivotitem
。pivotpoint
指向j
,并将pivotitem
移至该位置。总结一下,当函数终止时,变量pivotpoint
指向low
和high
之间的位置,和 {{1}之间的所有元素}和low
小于pivotpoint-1
,s[pivotpoint]
和pivotpoint+1
之间的所有元素都大于或等于high
。
答案 1 :(得分:0)
首先,您要选择一个枢轴元素。分割后,小于枢轴元素的所有元素将位于枢轴的左侧,并且大于枢轴的所有元素将位于右侧。您可以选择任何元素作为枢轴元素。 选择了枢轴元素后,首先要为枢轴元素指定一个初始位置,该位置在您的情况下较低。然后我们遍历所有元素,看看它们是否小于或大于枢轴元素。现在有两个案例出现了:
有关详细信息,请参阅quick sort。