template<typename T> void kpx(vector<T>& a, int left, int right) { if(left>=right) return; swap(a[left], a[rand()%(right-left+1)+left]); int i=left-1; for(int j=left; j<right; ++j){ if(a[j]<=a[right]){ ++i; swap(a[i], a[j]); } } swap(a[i+1], a[right]); kpx(a, left, i); kpx(a, i+2, right); }
分--将问题分解为规模更小的子问题
治--将这些规模更小的子问题逐个击破
相对于归并,不需要外存来合并(得出“母”问题的解)
对于特殊情况本来就有序的,就会退化为冒泡排序