voidquick_sort(int q[], int l, int r) { if (l >= r) return; //判断边界
int i = l - 1, j = r + 1, x = q[l + r >> 1]; //两个指针需要往外括一位,因为每次交换后需要先移动一位 while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j + 1, r); //这里需要注意边界问题,当用j和j+1时,x = q[l]不能用x = q[r];否则会有死循环 }
快排的平均时间复杂度为O(nlogn)
2、归并排序——基与分治
找分界点mid = [l + r] / 2
递归排序左边和右边
进行归并操作——将两个有序的序列合二为一(重点)(双指针算法)
归并排序的算法模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidmerge_sort(int q[], int l, int r) { if (l >= r) return;
int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; else tmp[k ++ ] = q[j ++ ];
while (i <= mid) tmp[k ++ ] = q[i ++ ]; while (j <= r) tmp[k ++ ] = q[j ++ ];
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j]; }
boolcmp(vector<int> A, vector<int> B) { if(A.size() != B.size()) return A.size() > B.size(); for(int i = A.size() - 1; i >= 0; i -- ) if(A[i] != B[i]) return A[i] > B[i]; returntrue; } // C = A - B, 满足A >= B, A >= 0, B >= 0 vector<int> sub(vector<int> A, vector<int> B) { vector <int> C; int t = 0; for(int i = 0; i < A.size(); i ++ ) { t = A[i] - t; if(i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); if(t < 0) t = 1; else t = 0; } while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
3、高精度乘法模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// C = A * b, A >= 0, b >= 0 vector<int> mul(vector<int> &A, int b) { vector<int> C;
int t = 0; for (int i = 0; i < A.size() || t; i ++ ) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; }
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C; }
4、高精度除法模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// A / b = C ... r, A >= 0, b > 0 vector<int> div(vector<int> &A, int b, int &r) { vector<int> C; r = 0; for (int i = A.size() - 1; i >= 0; i -- ) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
// 离散化函数,返回 x 离散化后的结果 intfind(int x, const vector<int>& alls){ int l = 0, r = alls.size() - 1; while (l < r) { int mid = l + r >> 1; if (alls[mid] >= x) r = mid; else l = mid + 1; } // 映射到从 1 开始的连续区间 return r + 1; }
int st = -2e9, ed = -2e9; for (auto seg : segs) if (ed < seg.first) { if (st != -2e9) res.push_back({st, ed}); st = seg.first, ed = seg.second; } else ed = max(ed, seg.second);