AC代码
- #include
- 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
- }
由归并排序的原理,我们还可以求逆序数对的问题
AC代码
- #include
- 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
- }
AC代码
- #define _CRT_SECURE_NO_WARNINGS
- #include
- 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;
- }