当前位置:首页 > 编程笔记 > 正文
已解决

排序算法模板

来自网友在路上 174874提问 提问时间:2023-09-19 05:31:26阅读次数: 74

最佳答案 问答题库748位专家为你答疑解惑

一,归并排序 

(1)基础排序  活动 - AcWing

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int a[N],b[N];void merge_sort(int l, int r);
void merge(int l, int r, int mid);int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];merge_sort(1, n);for (int i = 1; i <= n; i++) {cout << a[i];if (i != n) cout << " ";}return 0;
}void merge_sort(int l, int r)
{if (l >= r) return;//递归结束条件int mid = (l + r) / 2;merge_sort(l, mid);merge_sort(mid + 1, r);//不断细分merge(l, r, mid);//左右细分排序后,区间合并
}void merge(int l, int r, int mid)
{int i = l, j = mid + 1, t = l;//通过双指针将两个区间合入一个数组while (i <= mid && j <= r) {if (a[i] > a[j]) b[t++] = a[j++];else b[t++] = a[i++];}while(i<=mid) b[t++] = a[i++];while(j<=r) b[t++] = a[j++];for (int i = l; i < t; i++) a[i] = b[i];//将数组b的数据映射到数组a上,注意这里终止条件是i<t,而不是i<r
}

(2)逆序对   活动 - AcWing

由归并排序的原理,我们还可以求逆序数对的问题

题目原理   AcWing 788. 逆序对的数量 - AcWing

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int a[N], b[N];
long long ans;void merge_sort(int l, int r);
void merge(int l, int r, int mid);int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];merge_sort(1, n);/*for (int i = 1; i <= n; i++) {cout << a[i];if (i != n) cout << " ";}*/cout << ans << endl;return 0;
}void merge_sort(int l, int r)
{if (l >= r) return;//递归结束条件int mid = (l + r) / 2;merge_sort(l, mid);merge_sort(mid + 1, r);//不断细分merge(l, r, mid);//左右细分排序后,区间合并
}void merge(int l, int r, int mid)
{int i = l, j = mid + 1, t = l;//通过双指针将两个区间合入一个数组while (i <= mid && j <= r) {if (a[i] > a[j]) {ans = ans + mid - i + 1;//在归并的基础上加了一个条件b[t++] = a[j++];}else b[t++] = a[i++];}while (i <= mid) b[t++] = a[i++];while(j<=r) b[t++] = a[j++];for (int i = l; i < t; i++) a[i] = b[i];//将数组b的数据映射到数组a上,注意这里终止条件是i<t,而不是i<r
}

二,快速排序

(1)基本排序   活动 - AcWing

AC代码

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
long long a[N];
long long b[N];void quick_sort(int l, int r);int main()
{int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];quick_sort(1, n);for (int i = 1; i <= n; i++) cout << a[i] << " ";
}void quick_sort(int l, int r)
{if (l >= r) return;int i = l, j = r;int base = a[(l+r)/2];//取中间数作为基准数do{while (a[j] > base) j--;//在前面找到比中间数大的while (a[i] < base) i++;//在后面找到比中间数小的if (i <= j) {swap(a[i], a[j]);i++; j--;}} while (i < j);//注意终止条件 if (l < j) quick_sort(l, j);//再对前一部分进行排序的操作if (i < r) quick_sort(i, r);//对后面的部分进行操作return;
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"排序算法模板":http://eshow365.cn/6-9143-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!