统计数组的逆序对

来源:互联网 发布:通过网线共享网络 编辑:程序博客网 时间:2024/05/18 02:38

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

题目代码

思路:这个最简单的当然是直接统计了,算法时间复杂度为n^2,冒泡排序都可以。如果想进一步减少时间复杂度的话,可以考虑用递归的方法,比如使用归并排序。

下面贴代码。

int merge(int A[], int start, int mid, int end) {   int[] aux = new int[end - start + 1];  int i = start;  int j = mid + 1;   int k = 0;  int reverse = 0;   while (i <= mid && j <= end)   {   if (A[i] <= A[j])    {    aux[k++] = A[i++];   } else    {    reverse += mid - i + 1;    aux[k++] = A[j++];   }  }  while (i <= mid) {   aux[k++] = A[i++];  }   while (j <= end) {   aux[k++] = A[j++];  }   for (int m = 0; m < aux.length; ++m) {   A[start + m] = aux[m];  }  return reverse;  }   int count(int A[], int start, int end) {  if (end <= start) {   return 0;  }  int mid = (start + end) >> 1;  int count1 = count(A, start, mid);  int count2 = count(A, mid + 1, end);  return count1 + count2 + merge(A, start, mid, end); } 



0 0
原创粉丝点击