文章目录
😊点此到文末惊喜↩︎
归并排序
- 是否可递归:大问题能否通过范围缩小但是同等定义的子问题搞定
- 归并排序
void Merge(vector<int> &vec, int L, int mid, int R) {
const int n = R-L+1;
vector<int> tmp(n, 0);
int i = 0;
int p1 = L;
int p2 = mid+1;
while (p1 <= mid && p2 <= R) {
tmp[i++] = (vec[p1] <= vec[p2] ? vec[p1++] : vec[p2++]);
}
while (p1 <= mid) {
tmp[i++] = vec[p1++];
}
while (p2 <= R) {
tmp[i++] = vec[p2++];
}
for (int i = 0; i < n; ++i) {
vec[L+i] = tmp[i];
}
}
void Process(vector<int> &vec, int L, int R) {
if (L == R) return ;
int mid = L + ((R-L)>>1);
Process(vec, L, mid);
Process(vec, mid+1, R);
Merge(vec, L, mid, R);
}
void Process(vector<int> &vec) {
if (vec.size() < 2) return ;
const int n = vec.size();
int merge_size = 1;
while (merge_size < N) {
int L = 0;
while (L < N) {
int mid = L+merge_size-1;
if (mid >= N) break;
int R = min(mid+merge_size(), N-1);
merge(vec, L, mid, R);
L = R+1;
}
if (merge_size > N / 2) break;
merge_size <<= 1;
}
}
- 求数组小和,表示第i个数左侧小于等于该数的个数,然后整个数组的每个数的小和相加
- 逆反:相当于求第i个数右侧比i值大的个数
- 归并排序可以解决两个范围比较的问题
int Merge(vector<int> &vec, int L, int mid, int R) {
const int n = R-L+1;
vector<int> tmp(n, 0);
int i = 0;
int p1 = L;
int p2 = mid+1;
int res = 0;
while (p1 <= mid && p2 <= R) {
res += vec[p1] < vec[p2] ? (R-p2+1)*vec[p1] : 0;
tmp[i++] = (vec[p1] < vec[p2] ? vec[p1++] : vec[p2++]);
}
while (p1 <= mid) {
tmp[i++] = vec[p1++];
}
while (p2 <= R) {
tmp[i++] = vec[p2++];
}
for (int i = 0; i < n; ++i) {
vec[L+i] = tmp[i];
}
return res;
}
int Process(vector<int> &vec, int L, int R) {
if (L == R) return 0;
int mid = L + ((R-L)>>1);
return Process(vec, L, mid)
+ Process(vec, mid+1, R);
+ Merge(vec, L, mid, R);
}
快速排序
- partition过程:进行划分但不严格要求两部分内部有序,将小于等于num的数放在左边,将大于等于num的数放在右边
- 代码
int parititon(vector<int> &vec, int left, int right) {
int idx = left + rand() % (right - left + 1);
swap(vec[left], vec[idx]);
int pos = left;
int pivot = vec[left];
while (left < right) {
while (vec[right] >= pivot && left < right) right--;
while (vec[left] <= pivot && left < right) left++;
swap(vec[left], vec[right]);
}
swap(vec[left], vec[pos]);
return left;
}
void QuickSort(vector<int> &vec, int left, int right) {
if (left > right) return ;
int mid = parititon(vec, left, right);
QuickSort(vec, left, mid-1);
QuickSort(vec, mid+1, right);
}
少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波
🚩点此跳转到首行↩︎
参考博客
- 对数器
- 单调队列
- 快速链表quicklist
- 《深入理解计算机系统》
- 侯捷C++全系列视频
- 待定引用
- 待定引用
- 待定引用