逆序对(归并)

使用归并的逻辑,在两个子数组拍完序之后,归并之前,后一个数组中的每一个数字a,前一个数组中与a配对的逆序对的数量可以用归并排序的方式求得。

#include <vector>
#include <iostream>
using namespace std;

int Merge(vector<int>& arr, int b, int e) {
  if (b >= e) return 0;
  int reverse_pair_num = 0;
  int mid = (b + e) / 2;
  vector<int> tmp;
  tmp.resize(e - b + 1);
  int i = b;
  int j = mid + 1;
  int pos = 0;
  while (i <= mid && j <= e) {
    if (arr[i] > arr[j]) {
      tmp[pos++] = arr[i++];
    } else {
      tmp[pos++] = arr[j++];
      reverse_pair_num += i - b;
    }
  }
  while (i <= mid) {
    tmp[pos++] = arr[i++];
  }
  while (j <= e) {
    tmp[pos++] = arr[j++];
    reverse_pair_num += i - b;
  }
  pos = 0;
  for (; b <= e; ++b) {
    arr[b] = tmp[pos++];
  }
  return reverse_pair_num;
}

int MergeSort(vector<int>& arr, int b, int e) {
  if (b >= e) return 0;
  int reverse_pair_num = 0;
  int mid = (b + e) / 2;
  reverse_pair_num += MergeSort(arr, b, mid);
  reverse_pair_num += MergeSort(arr, mid + 1, e);
  reverse_pair_num += Merge(arr, b, e);
  return reverse_pair_num;
}

int main() {
  int a[] = {3,3,2,1,11,13,2,1,7,8};
  vector<int> arr;
  arr.assign(a, a + sizeof(a) / sizeof(int));
  cout << MergeSort(arr, 0, arr.size() - 1) << endl;
  for (int i = 0; i < arr.size(); ++i) {
    cout << arr[i] << "\t";
  }
  cout << endl;
  return 1;
}

 

posted @ 2013-08-25 19:07  dmthinker  阅读(135)  评论(0)    收藏  举报