主体思想为归并排序的改编版,题目来自算法导论课后题2-4第 d)题,给出一个算法,它能用O(nlogn)的最坏情况运行时间,确定n个元素的任何排序中逆序对的数目。
思路:归并排序的改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),
合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,count += mid+1 - i。class Merge{
int cnt;
public int InversePairs(int array[]){
cnt=0;
if (array!=null){
mergeSortUp2Down(array,0,array.length-1);
}
return cnt;
}
private void mergeSortUp2Down(int[] array, int start, int end) {
if (start>=end){
return ;
}
int mid=(start+end)>>1;
mergeSortUp2Down(array,start,mid);
mergeSortUp2Down(array,mid+1,end);
merge2(array,start,mid,end);
}
private void merge2(int[] array, int start, int mid, int end) {
int[] temp=new int[end-start+1];
int i=start,j=mid+1,k=0;
while(i<=mid&&j<=end){
if (array[i]<=array[j]){
temp[k++]=array[i++];
}else{
temp[k++]=array[j++];
cnt+=mid-i+1;
}
}
while(i<=mid){
temp[k++]=array[i++];
}
while (j<=end){
temp[k++]=array[j++];
}
for (k=0;k<temp.length;k++){
array[start+k]=temp[k];
}
}
}