利用归并排序求数列中逆序对个数
2010-10-08 01:31
309 查看
参考了这篇文章:http://blog.csdn.net/MapReduce/archive/2007/05/20/1618515.aspx
以前自己写的归并排序比较累赘,文章中的代码更有条理,而且计算逆序对个数只需要一行代码,是否对原数列进行排序也只需要决定是否取舍一行代码。
以前自己写的归并排序比较累赘,文章中的代码更有条理,而且计算逆序对个数只需要一行代码,是否对原数列进行排序也只需要决定是否取舍一行代码。
#include <stdio.h> #include <stdlib.h> int ans; void copy(int a[], int b[], int l, int r) { int i = l; while (i <= r) { a[i] = b[i]; i++; } } void merge(int a[], int b[], int l, int m, int r) { int i = l, j = m + 1; while (i <= m && j <= r) { if (a[i] <= a[j]) b[l++] = a[i++]; else { b[l++] = a[j++]; ans += m - i + 1; // 求逆序对的个数:a[i]到a[m]的每一个数,都会与a[j]构成一个逆序对 } } while (i <= m) b[l++] = a[i++]; while (j <= r) b[l++] = a[j++]; } void merge_sort(int a[], int b[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; merge_sort(a, b, l, m); merge_sort(a, b, m + 1, r); merge(a, b, l, m, r); copy(a, b, l, r); } } void foo(int a[], int size) { int *b = new int[size]; merge_sort(a, b, 0, size - 1); delete b; b = NULL; } int main() { int a[] = {6, 5, 4, 3, 2, 1}, i; foo(a, sizeof(a) / sizeof(int)); for (i = 0; i < sizeof(a) / sizeof(int); i++) printf("%d ", a[i]); printf("/nans = %d/n", ans); return 0; }
相关文章推荐
- poj 2299 利用归并排序求逆序数
- 利用归并排序求逆序数
- 利用归并排序求逆序对
- POJ 2299 分治法求数列逆序对(归并排序)
- ACM:归并排序,以及利用归并排序思想求解逆序对数!
- 求逆序对数(利用归并排序)
- 哈理工OJ 2224 逆序对问题(利用归并排序求逆序数对数)
- 利用归并排序求逆序对
- 利用归并排序求逆序对
- 归并排序及利用归并排序求逆序对数
- 利用归并排序求数组中的逆序对
- 利用归并排序求逆序数
- 归并排序求逆序数
- BZOJ2431: [HAOI2009]逆序对数列 DP
- 归并排序求数组逆序对数
- [BZOJ2431][HAOI2009]逆序对数列(DP)
- 归并排序-逆序对数
- poj2299 归并排序求逆序数
- 利用指针实现将5个整数输入到数组a中,然后将a逆序复制到数组b中,并输出b中各单元的值。
- 【SGU 180】Inversions —— 归并排序或树形数组计算逆序对