除了仅搜索数组的一侧之外,快速排序和快速选择之间是否有区别?
答案 0 :(得分:1)
一个区别是,由于在每个级别仅搜索一个分区,因此可以使用迭代代替递归。使用Lomuto分区方案的示例代码。更好的数据透视选择(而不是ahi)会有所帮助,具体取决于数据模式。
int QuickSelect(int a[], int sz, int k)
{
int lo = 0;
int hi = sz-1; // (no check for empty array)
while (lo < hi){
int p = a[hi]; // Lomuto partition
int i = lo;
for (int j = lo; j < hi; ++j){
if (a[j] < p){
std::swap(a[j], a[i]);
++i;
}
}
std::swap(a[i], a[hi]);
if (k == i) // if pivot == kth element, return it
return a[k];
if (k < i) // loop on partition with kth element
hi = i - 1;
else
lo = i + 1;
}
return a[k]; // sorted to kth elemement, return it
}
答案 1 :(得分:0)
这两种算法都是由 Tony Hoare 创建的分而治之的算法。
在机器人算法中,我们将数组从枢轴元素划分为 2 个数组。
[el-1,el-2,....el-pivot,.......,el-last]
我们知道“el-pivot”左侧的元素比“el-pivot”小,但它们没有排序。所以我们在快速排序算法中对两个子数组应用快速排序
在快速选择中,我们不对数组进行排序。快速选择算法专门用于查找数组中的第 k 个最小元素。我们知道el-pivot左边的所有元素都比el-pivot小,所以我们不关心左边的排序,所以我们不划分左边。这将复杂度从 O(nlog2(n)) 降低到 O(n)