轻松一招:让快速排序算法更快
众所周知快排算法的时间复杂度最坏是O(n*n)。实际上通过随机变换就能将平均复杂度降低到接近O(nlogn),通过随机shuffle打乱有序结构就可以做到。 代码非常简单,可以破解OJ平台上的许多TLE case。具体而言,在partition划分时,我们随机选择一个值做pivot,并将该pivot固定在有序表的开头或者结尾就能实现。
private int partition(int[] nums, int p, int r){
int x = (int)(rnd.nextInt(r - p + 1)) + p;
nums[x] = nums[r] ^ nums[x] ^ (nums[r] = nums[x]);
int q = p - 1;
for(int i = p; i < r; i++){
if(nums[i] < nums[r])continue;
q++;
nums[q] = nums[i] ^ nums[q] ^ (nums[i]=nums[q]);
}
nums[q+1]=nums[r] ^ nums[q+1] ^ (nums[r] = nums[q+1]);
return q + 1;
}