最近写了几次快速排序, 但是总感觉自己学的不是很清楚。 今天尝试写了下,发现怎么也写不对。其实,小小的快速排序中,也是有很大的坑存在的。
void quick_sort(vector<int>&nums, int begin ,int end){
int l = begin;
int r = end;
//坑0 .记住配合下面的坑3 ,这里一定要
l-=1;
r+=1;
//坑1. 这个哨兵不能随便选, 选中位数会很慢。 选一个随机的位置会很快。
int choose = nums[ rand()%(end-begin+1)+begin];
//坑2. 记住别在这些边界条件上加= 号
while(l<r){
//坑3! 大坑。 每次while ,都要先让l 和 r 移动。 否则有可能死循环
l+=1;
r-=1;
while(nums[l]<choose) l++:
while(nums[r]>choose) r++;
//坑4! 只有合法才能交换!
if(l<r) swap(nums,l,r)
}
quick_sort(nums,beign,r);
quick_sort(nums,r+1,end);
}