一尘不染

快速选择算法的理解

algorithm

我一直在研究各种讨论quicksort和quickselect的教程和文章,但是我对它们的理解仍然不稳定。

给定这种代码结构,我需要能够掌握和解释quickselect的工作原理。

// return the kth smallest item
int quickSelect(int items[], int first, int last, int k) {
    int pivot = partition(items, first, last);
    if (k < pivot-first) {
        return quickSelect(items, first, pivot, k);
    } else if (k > pivot) {
        return quickSelect(items, pivot+1, last, k-pivot);
    } else {
        return items[k];
    }
}

在分解为伪代码时,我需要一些帮助,虽然尚未提供分区功能代码,但我想了解在提供快速选择功能的情况下它将执行的操作。

我知道quicksort的工作原理,但不是quickselect。我刚刚提供的代码是一个示例,说明了如何格式化快速选择。

编辑:更正的代码是

int quickSelect(int items[], int first, int last, int k) 
{
    int pivot = partition(items, first, last);
    if (k < pivot-first+1) 
    { //boundary was wrong
        return quickSelect(items, first, pivot, k);
    } 
    else if (k > pivot-first+1) 
    {//boundary was wrong
        return quickSelect(items, pivot+1, last, k-pivot);
    }
    else 
    {
        return items[pivot];//index was wrong
    }
}

礼貌:@海涛


阅读 239

收藏
2020-07-28

共1个答案

一尘不染

快速选择的重要部分是分区。因此,让我先解释一下。

快速选择分区选择一个pivot(随机或第一个/最后一个元素)。然后,它重新排列列表,使所有少于元素的元素pivot都位于数据透视表的左侧,而少于元素的元素位于右侧。然后,它返回pivot元素的索引。

现在,我们在这里找到第k个最小元素。分区后的情况是:

  1. k == pivot。那么您已经发现第k个最小的。这是因为分区的工作方式。正好有k - 1那些比更小的元素kth元素。
  2. k < pivot。然后,第k个最小点位于的左侧pivot
  3. k > pivot。然后,第k个最小点位于枢轴的右侧。要找到它,您实际上必须k-pivot在右边找到最小的数字。
2020-07-28