统计数组的逆序对

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PirLCK/article/details/52451517

题目描述

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

题目代码

思路:这个最简单的当然是直接统计了,算法时间复杂度为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);
 }
 



阅读更多
换一批

没有更多推荐了,返回首页