1.三指针算法
在力扣题库中,题型中添加了超大量的重复数据;根本无法使用sort快排,一使用就超时;
三指针快排,是在双指针快排下,提出的优化方案,
无重复数据推荐使用双指针快排;
大量重复数据推荐使用三指针快排;
如果在数据结构章节,已经学会了快排的精髓;三指针代码一看就会;
2.题型
力扣:75、912、215、159;
3.模版代码如下
简单叙述如下:找到nums中的一个数key,将小于key的放在左边,大于key的放在右边;这样key的相对位置就确定了;(如果不理解请看我的一篇文章:数据结构:插入排序)再把小于key的,和大于key的,那两个区域如此排好序;
vector<int> sortArray(vector<int>& nums) {
srand(time(NULL)); // 种下随机数种子
quicksort(nums, 0, nums.size() - 1);
return nums;
}
void quicksort(vector<int>& nums, int l, int r) {
if (l >= r) return;
// 数据分三块
int key = getRandom(nums, l, r);
int i = l, left = l - 1;
int right = r + 1;
while (i < right) {
if (nums[i] < key) {
left++;
swap(nums[i], nums[left]);
i++;
} else if (nums[i] >key) {
right--;
swap(nums[i], nums[right]);
} else i++;
}
//[1,left][left,right-1][right,r]
quicksort(nums,l,left);
quicksort(nums,right,r);
}
int getRandom(vector<int>& nums, int left, int right) {
int r = rand();
return nums[r % (right - left + 1) + left];
}
4.提示
4.1千万不要相信,数据的绝对随机性;因为数据都是人写出来的,都是伪随机的,或人为排列的;所以只能再次通过种随机数种子伪随机,达到空间和时间复杂度的最小化;