排序综合

1、基础排序(cmp函数自定义排序,sort的复杂度几乎为nlogn)
`struct Ren
{
int a;int b;
}ren[1000010];

bool cmp(const Ren& i, const Ren& j) {
if (i.zhi < j.zhi) {
return true;
}
else {
if (i.zhi == j.zhi) {
if (i.ji > j.ji) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}//一个return true一定要和一个false对应,不然会报错
}
sort(a,a+n,cmp);
`

2、归并排序(快排不常用):逆序对计数
int tmp[100010];//临时存放处 long long num=0; long long merge_sort(int q[], int l, int r) { if (l >= r)return 0; int mid = (l + r) / 2; num = (merge_sort(q, l, mid) + merge_sort(q, mid + 1, r));//总逆序对数量等于两边各自的数量加起来 int i = 0; int j = l; int k = mid + 1; while (j <= mid && k <= r) { if (q[j] <= q[k]) {tmp[i] = q[j]; i++; j++;} else { tmp[i] = q[k]; num += mid - j + 1; i++; k++;}//后面有一个小,则它和前面part的所有数都构成逆序对 } while (j <= mid) { tmp[i] = q[j]; i++; j++;}//所有后面的放在前面时已经记录了逆序对,这里不用记录 while (k <= r) { tmp[i] = q[k]; i++; k++; } int k2 = 0; for (int j2 = l; j2 <= r; j2++) { q[j2] = tmp[k2]; k2++; } return num; } int main() { int n; scanf("%d", &n); int a[100010]; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } long long res = merge_sort(a, 0, n - 1); cout<<res; return 0; }

3、stl
set, multiset, map, multimap、priority_queue默认自动有序,vector, list, deque, string无序;
priority_queue<int, vector<int>> pq; // 默认top是最大值
priority_queue<int, vector<int>, greater<int>> pq; // 小顶堆
结构体自定义排序
`struct Node {
int val, id;
};

struct cmp {
bool operator()(const Node &a, const Node &b) {
return a.val > b.val;
}
};

priority_queue<Node, vector, cmp> pq;
`

posted @ 2025-10-06 16:51  yubai111  阅读(5)  评论(0)    收藏  举报