本文主要是介绍Leetcode|快排|912. 排序数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;}
};
这篇关于Leetcode|快排|912. 排序数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!