java实现数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对,例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。,即输出P%1000000007。
代码
解法一
暴力简单低效,不会改变原数组
publicstaticintinversePairs(int[]array){ if(array==null||array.length<2){ return0; } intcount=0; for(inti=0;iarray[j]){ count++; } } } returncount%1000000007; }
解法二
利用数组的归并排序,高效,但是会改变原数组
publicstaticintinversePairs2(int[]array){ if(array==null||array.length<2){ return0; } intcount=mergeSort(array,0,array.length-1); returncount%1000000007; } privatestaticintmergeSort(int[]array,intstart,intend){ if(start>=end){ return0; } //找到数组的中点,分割为两个子数组,递归求解 intmiddle=(start+end)/2; intleft=mergeSort(array,start,middle); intright=mergeSort(array,middle+1,end); //存储归并后的数组 int[]copy=newint[array.length]; System.arraycopy(array,start,copy,start,end-start+1); //从两个子数组的尾部开始遍历 inti=middle; intj=end; intcopyIndex=end; //记录逆序对的数量 intcount=0; while(i>=start&&j>=middle+1){ //数组是升序的 //如果左边数组比右边数组大,则将大的放入存储数组中 //并且累加逆序对,应为是有序的,所以左边数组的第i个元素比第j个及其之前的数都大 if(array[i]>array[j]){ copy[copyIndex--]=array[i--]; count+=(j-middle); }else{ copy[copyIndex--]=array[j--]; } } //将子数组剩余的部分一次写入归并后的存储数组 while(i>=start){ copy[copyIndex--]=array[i--]; } while(j>=middle+1){ copy[copyIndex--]=array[j--]; } //将本次两个子数组的合并写入原数组中 for(intk=start;k<=end;k++){ array[k]=copy[k]; } returnleft+right+count; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。