求数组的逆序对

来源:互联网 发布:淘宝代刷平台 编辑:程序博客网 时间:2024/05/20 05:08
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。

概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。

分析:

方法1:暴力循环,时间复杂度为O(n2)

方法2:利用堆排序的思想,首先将数组拆分到底,然后在合并的过程中排序,同时计算逆序对的数量

以下是java代码的实现

package leetcode;public class Pairs {public static void main(String[] args) {// TODO Auto-generated method stubint[] A={3,2,5,6,9,4};int result=split(A,0,A.length-1);System.out.println(result);}public static int split(int[] A,int left,int right){int result=0;if(left>=right) return result;int mid=(left+right)/2;result+=split(A,left,mid);result+=split(A,mid+1,right);result+=merge(A,left,right,mid);return result;}public static int merge(int[] A,int left,int right,int mid){int result=0;int[] temp=new int[right-left+1];int i=mid,j=right,k=0;//计算逆序对的数量,同时排序while(i>=left && j>mid){if(A[i]>A[j]){result+=(j-mid);temp[k++]=A[i--];}else{temp[k++]=A[j--];}}while(i>=left){temp[k++]=A[i--];}while(j>mid){temp[k++]=A[j--];}//将数组排好序,供下次下次循环使用for(int m=left;m<=right;m++){A[m]=temp[--k];}return result;}}



0 0
原创粉丝点击