Algorithm 快速排序算法和快速选择算法的区别是什么?

Algorithm 快速排序算法和快速选择算法的区别是什么?,algorithm,quicksort,Algorithm,Quicksort,除了只搜索数组的一侧外,快速排序和快速选择之间有什么区别吗?一个区别是,由于在每个级别上只搜索一个分区,因此可以使用迭代而不是递归。使用Lomuto分区方案的示例代码。更好的枢轴选择(而不是[hi])将有助于根据数据模式进行选择 int QuickSelect(int a[], int sz, int k) { int lo = 0; int hi = sz-1; // (no check for empty array) while (lo &

除了只搜索数组的一侧外,快速排序和快速选择之间有什么区别吗?

一个区别是,由于在每个级别上只搜索一个分区,因此可以使用迭代而不是递归。使用Lomuto分区方案的示例代码。更好的枢轴选择(而不是[hi])将有助于根据数据模式进行选择

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
}
intquickselect(inta[],intsz,intk)
{
int-lo=0;
int hi=sz-1;//(不检查空数组)
while(lo
这两种算法都是Tony Hoare创建的分治算法

在bot算法中,我们将数组从pivot元素划分为2个数组

[el-1,el-2,....el-pivot,.......,el-last]
我们知道位于“el pivot”左侧的元素比“el pivot”小,但它们没有排序。因此,我们在快速排序算法中将快速排序应用于两个子阵列

在快速选择中,我们不会对数组进行排序。快速选择算法专门用于查找数组中的第k个最小元素。我们知道el-pivot左侧的所有元素都比el-pivot小,因此我们不关心左侧的排序,因此我们不划分左侧。这将复杂性从O(nlog2(n))降低到O(n)