龙空技术网

Quickselect快速选择算法 怎么找pivot

北美程序员的自我修养 52

前言:

眼前我们对“quickselect算法平均复杂度分析”大体比较讲究,各位老铁们都想要知道一些“quickselect算法平均复杂度分析”的相关文章。那么小编也在网摘上收集了一些有关“quickselect算法平均复杂度分析””的相关文章,希望朋友们能喜欢,各位老铁们快快来了解一下吧!

上次咱说了当数组里没有任何排序,quick select是一种普遍适用的搜索算法。

quick select算法咱们之前思路说过,每次找一个pivot,把比pivot小的放他左边,大的在右边。有了这个局部排序之后,就可以继续使用之前二分法算法的思路,当target > pivot, 就在pivot右边继续搜索。不然就在pivot左侧继续搜索。这个二分法搜索的思路之前说过,算法也介绍过,就不再赘述。

那具体我们怎么选择这个pivot并且进行排序呢?下面就是这个部分的算法。手机上手打,难免错漏,请见谅。

int getPivot(int left, int right, int[] nums){

int pivotIndex = (left + right)/2; // this can a random number between left and right

int pivot = nums[pivotIndex];

int curSlot = left; // 当前位置,把比pivot小的数换到这个位置上

swap(nums, pivotIndex, right); // 先把pivot丢到最后变不管它

// loop里把所有比pivot小的放到左边

for(int i =0; i < right; i++){

if(nums[i] < pivot){

swap(nums, curSlot++, i); // 每次要移动curSlot

}

}

// 最后把pivot放到最后一个比他小的数的后面,这样能保证[left, curSlot-1] < pivot,[curSlot + 1, right] >= pivot.

swap(nums, curSlot, right);

return curSlot;

}

swap这个很简单:

void swap(int [] nums, int i, int j){

int temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

quick select其实也有更简洁的写法,这里为了理解方便,用的比较经典的实现办法。

这部分算法也可以用在quick sort里。这一段其实本来就是quicksort的算法的一部分。以后有机会咱们再说说quick sort算法。

标签: #quickselect算法平均复杂度分析