快排两路划分(洛谷最后一个例子超时)
void quick_sort(int* a, int l, int r) { if(l>=r) return; int ml = l+1, mr = r, key=a[l]; while(true){ while(ml<=r&&a[ml]<=key) ml++; while(mr>=l+1&&a[mr]>=key) mr--; if(ml>mr) break; swap(a[ml++], a[mr--]); } swap(a[l], a[mr]); quick_sort(a, l, mr-1); quick_sort(a, mr+1, r); return ; }
快排三路划分(速度飞起)
void _qsort2(int a[], int l, int r) { // 三路快排 // l-(lt-1): 小于a[l]的元素 // lt-(i-1): d等于a[l]的元素 // i-gt: 不确定的元素 // (gt+1)-(r): 大于a[l]的元素 if (l >= r) return ; int lt = l; int i = l; int gt = r; int v = a[l]; while (i <= gt) { if (a[i] == v) i++; else if (a[i] < v) { swap(a[lt], a[i]); i++; lt++;} else { swap(a[gt], a[i]); gt--;} } _qsort2(a, l, lt - 1); _qsort2(a, gt + 1, r); return ; }
抓住青春的尾巴。。。