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); }
分--將問題分解為規模更小的子問題
治--將這些規模更小的子問題逐個擊破
相對於歸並,不需要外存來合並(得出“母”問題的解)
對於特殊情況本來就有序的,就會退化為冒泡排序
