
1 快速排序(随机pivot)
为什么随机取pivot能避免最坏的情况呢?
假设数据是完全随机的话,固定取最后一个数作为pivot,和随机取pivot,达成pivot本身有序的概率是相等的。但实际情况并非如此,实际的数据里有序的情况是多于完全无序的情况的,所以随机取pivot能减少最坏情况出现的概率
class Solution {
public:
void quickSort(vector<int>& nums, int left, int right) {
if (left >= right) return;
int i = left, j = right;
// rand()产生从0-INT_MAX中任意整数,使用rand() % num可得[0, num]之间任意整数
int pivot = rand() % (right - left + 1) + left;
// 先找pivot,然后交换left和pivot的值,其他按照left执行即可
swap(nums[left], nums[pivot]);
int pos = nums[left];
while (i < j) {
while (nums[j] >= pos && i < j) j--;
while (nums[i] <= pos && i < j) i++;
if (i < j) swap(nums[i], nums[j]); // 需要保证i < j
}
swap(nums[left], nums[i]);
quickSort(nums, left, i - 1);
quickSort(nums, i + 1, right);
}
vector<int> sortArray(vector<int>& nums) {
quickSort(nums, 0, nums.size() - 1);
return nums;
}
};


这篇博客探讨了在快速排序算法中如何通过随机选取pivot来避免最坏情况的发生。作者指出,随机取pivot可以有效减少完全有序数据导致的效率低下问题,因为在实际数据中有序情况比完全无序更常见。文章详细展示了使用C++实现的快速排序代码,并解释了其工作原理。
365

被折叠的 条评论
为什么被折叠?



