归并排序顺带求逆序对

来源:互联网 发布:Bigbang yg知乎 编辑:程序博客网 时间:2024/05/22 08:21

以前没有学过归并排序,所以这次研究逆序对很是困难。

感谢这位大神,让我终于AC 了逆序对:http://blog.csdn.net/shen823797837/article/details/8794919

其实它的思想与归并排序是一样的,并且是基于归并排序的。

先求各个部分(分治)的逆序对个数,并将该部分的原数组排序。在归并的时候比较两个部分中数的大小,这里排序就派上用场了

#include <iostream>#include <string>using namespace std;int msort(int a[], int px[], int l, int r)//注意px和a数组是在递归过程中不断互换的,因为在递归过程中会进行排序{  if (l == r)    return 0;  int mid = l + (r - l) / 2;    int left = msort(px, a, l, mid);    int right = msort(px, a, mid + 1, r);    int i = mid, j = r, k = r + 1;    int ans = left + right;  while (i >= l && j >= mid+1)  {    if (px[i] > px[j])    {      a[--k] = px[i--];      ans += j - mid;    }    else      a[--k] = px[j--];  }  while (i >= l)      a[--k] = px[i--];  while (j >= mid + 1)      a[--k] = px[j--];  return ans;}int zhongzhuan(int a[], int n){  int px[110];  for (int i = 0; i < n; ++i)    px[i] = a[i];  return msort(a, px, 0, n-1);}int main() {  int a[10] = {7, 5, 6, 4};  cout << zhongzhuan(a, 4) << endl;  return 0;}


原创粉丝点击