我一直在研究各种讨论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 } }
礼貌:@海涛
快速选择的重要部分是分区。因此,让我先解释一下。
快速选择分区选择一个pivot(随机或第一个/最后一个元素)。然后,它重新排列列表,使所有少于元素的元素pivot都位于数据透视表的左侧,而少于元素的元素位于右侧。然后,它返回pivot元素的索引。
pivot
现在,我们在这里找到第k个最小元素。分区后的情况是:
k == pivot
k - 1
kth
k < pivot
k > pivot
k-pivot