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;
}
};