排序
https://www.luogu.com.cn/problem/P1177
桶排序
归并排序
分治
void paixu(int l,int r){
if(l >= r) return;
int mid = (l + r) >> 1;
paixu(l,mid); paixu(mid+1,r);
int i = l, j = mid + 1, cnt = l-1;
while(i <= mid && j <= r){
if(a[i] <= a[j]) {b[++cnt] = a[i]; ++i;}
else {b[++cnt] = a[j]; ++j;}
}
while(i <= mid) {b[++cnt] = a[i]; ++i;}
while(j <= r) {b[++cnt] = a[j]; ++j;}
for(i = l; i <= r; ++i) a[i] = b[i];
}
求逆序对
void paixu(int l,int r){
if(l >= r) return;
int mid = (l + r) >> 1;
paixu(l,mid); paixu(mid+1,r);
int i = l, j = mid + 1, k = l;
while(i <= mid && j <= r){
if(a[i] <= a[j]) {b[k] = a[i]; i++; k++;}
else {
b[k] = a[j]; j++; k++;
ans += mid - i + 1;
}
}
while(i <= mid) {b[k] = a[i]; i++; k++;}
while(j <= r) {b[k] = a[j]; j++; k++;}
for(int i = l; i <= r; ++i) a[i] = b[i];
}
快速排序
void paixu(int l,int r){
if(l >= r) return;
int i = l, j = r, mid = a[(l + r) >> 1];
while(i <= j){//要加等号,不然不能运行🤔(不太明白)
while(a[i] < mid) i++;
while(a[j] > mid) j--;
if(i <= j){
swap(a[i],a[j]);
i++; j--;
}
}
paixu(l,j); paixu(i,r);
}

浙公网安备 33010602011771号