一、快排(三路划分)
一般的快排遇到大量重复元素会有所下降,若全部为同一个数,时间复杂度为O(N^2),使用三路划分进行优化,则可以很好解决这种问题,若所有元素相同,时间复杂度为O(N^2)。
再取nums中随机一个数作为key,可以使排序时间复杂度更接近O(NlogN)
void qSort(vector<int>& nums, int begin, int end)
{
if(begin >= end)
return;
srand(time(0));
//数组分三块
int key = nums[rand() % (end - begin + 1) + begin];
int left = begin - 1, right = end + 1, i = begin;
while(i < right)
{
if(nums[i] < key)
swap(nums[++left], nums[i++]);
else if(nums[i] == key)
++i;
else
swap(nums[--right], nums[i]);
}
qSort(nums, begin, left);
qSort(nums, right, end);
}
vector<int> sortArray(vector<int>& nums) {
qSort(nums, 0, nums.size() - 1);
return nums;
}