java实现通过归并排序计算数组逆数对个数
2017-07-16 21:05
591 查看
计算逆数对个数
public class Inv_numpair {private int count=0; //逆数对的数量
public static int[] geneateArrays(int n){
int arr[]=new int
;
for(int i=0;i<n;i++){
arr[i]=new Random().nextInt(n)+1;
}
return arr;
}
public void mergesort(int[] arr,int n){
__mergesort(arr,0,n-1);
}
public void __mergesort(int[] arr,int l,int r){
if(l>=r)
return;
int mid=(l+r)/2;
__mergesort(arr,l,mid);
__mergesort(arr,mid+1,r);
if(arr[mid]>arr[mid+1]) //若arr[mid]<arr[mid+1],则数组已经有序,if判断下减少了归并步骤
__merge(arr,l,mid,r);
}
//将arr[l,mid]和arr[mid+1,r]两个部分进行归并
public void __merge(int[] arr,int l,int mid,int r){
int aux[]=new int[r-l+1];
for(int i=l;i<=r;i++){
aux[i-l]=arr[i]; //i-l:减去偏移量
}
int i=l,j=mid+1; //分别指向两个数组的开头
for(int k=l;k<=r;k++){
if(i>mid){ //若aux[]左半边的元素都访问完了,则将aux右半边剩余元素赋值回arr[]
arr[k]=aux[j-l];
j++;
}
else if(j>r){ //若aux[]右半边的元素都访问完了,则将aux左半边剩余元素赋值回arr[]
arr[k]=aux[i-l];
i++;
}
else if(aux[j-l]<aux[i-l]){ //在aux[]中比较后,将正确结果赋值回arr[]
count=count+mid-i+1;
arr[k]=aux[j-l];
j++;
}else{ //aux[i-l]<=aux[j-l]
arr[k]=aux[i-l];
i++;
}
}
}
public int count(){
return count;
}
public static void main(String[] args) {
int arr[] =MAIN.geneateArrays(12);
for(int i=0;i<arr.length;i++){
System.out.print(" "+arr[i]);
}
Inv_numpair in=new Inv_numpair();
in.mergesort(arr,arr.length);
System.out.println();
System.out.println("逆数对的数量: "+in.count());
}
}跟归并排序相比就加了两行代码
结果如图:
相关文章推荐
- Java通过几种经典的算法来实现数组排序
- java计算100!通过数组实现
- Java通过冒泡法实现数组排序
- Java通过几种经典的算法来实现数组排序
- 归并排序 & 数组中的逆序对 【java实现】
- Java实现栈二:通过数组方式实现
- java类实现数组的五种排序 冒泡排序、选择排序、插入排序、希尔排序、数组排序
- 通过/proc/stat文件信息,java实现计算cpu使用率
- 归并排序:数组和单链表实现
- java数组的排序 对象数组的排序 Comoarable接口实现 compareTo函数实现
- (Java)数组的选择排序法和二分查找法实现
- java通过复选框控件数组实现添加多个复选框控件示例分享
- 【java】数组/列表排序功能的两种实现
- 程序员必知的8大排序(java实现)(三)(冒泡+快速+归并)
- java实现的排序(插入/希尔/归并)
- java实现归并排序及求逆序对
- 2011-12-04 15:36 JAVA实现位向量给无重复元素的整数数组排序
- 归并排序--数组和链表的实现
- java 快速排序算法--归并排序的实现
- 对数组进行排序,并记录下标值的Java实现