数组中的逆序对数

来源:互联网 发布:淘宝开放平台有什么用 编辑:程序博客网 时间:2024/04/30 13:43

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。


#include <stdio.h>#include <stdlib.h>using namespace std;int count = 0;void merge(int a[], int left, int mid, int right){    int p = left;int q = mid + 1;int *buf = new int[right-left+1];int curr = 0;while (p <= mid && q <= right){if (a[p] <= a[q]){buf[curr++] = a[p++];}else{buf[curr++] = a[q++];count += mid-p+1;}}while (p <= mid){buf[curr++] = a[p++];}while (q <= right){buf[curr++] = a[q++];}for (int i = 0; i < curr; i++){a[left+i] = buf[i];}delete []buf;}void mergeSort(int a[], int left, int right){if (left >= right){return;}int mid = left + (right-left)/2;mergeSort(a, left, mid);mergeSort(a, mid+1, right);merge(a, left, mid, right);}int fun(int a[], int n){count = 0;mergeSort(a, 0, n-1);return count;}


0 0
原创粉丝点击