利用归并排序求逆序对及java代码实现

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

一、相关概念

  1. 逆序对:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。
    如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。
  2. 归并排序:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、代码实现

求逆序对的使用的排序方式多种多样,比如使用直接插入排序,逆序对的数目就是直接插入排序的时间复杂度,由于直接插入排序时间复杂度是O(n^2),因此执行速度慢,运行次数多,故我们这里使用复杂度为O(nlogn)的归并排序进行逆序对的计算。如果采用归并排序的方式进行处理,将一个数组进行二分切割,一个数组的全部逆序对的数目等于切割后的左边的数组的逆序对加上右边的逆序对和左边从第i个值left_arr[i]>right_arr[j]值的个数(mid-i+1),其中假设left_arr,right_arr分别为切割后左右两边的数组部分并且按照升序排列好。其中这里mid为切割数组的中间位置,(left+right)/2;其中左边数组和右边的数组的逆序对的求法又是分别切分成两块进行计算,因此采用递归运行即可。实现代码如下。

public class CountInversion {
	static int count=0;
	public static void main(String[] args) {
		float arr[]= {2f,3f,8f,6f,1f};
		int mergeSort = MergeSort(arr, 0, arr.length-1);
		System.out.println(mergeSort);
	}
	
	public static int MergeSort(float sort_array[],int left,int right) {
		/*
		 * 归并排序的递归实现。算法的时间复杂度(O(nlogN)),空间复杂度为(O(N)).属于稳定的排序方法,但不是原地排序方法。
		 * 这个方法缺点就是需要大量的内存空间。O(n).
		 * 适用于数据量较大的场景,且要求稳定性的场景。
		 */
		int sum=0;
		if(left<right) {
			int mid=(left+right)/2;
			MergeSort(sort_array,left,mid);
			MergeSort(sort_array,mid+1,right);
			sum=Merge_Array(sort_array,left,right);
		}
		return sum;
	}
	private static int  Merge_Array(float[] sort_array, int left, int right) {
		int mid=(left+right)/2;
		int i=left;
		int j=mid+1;
		int k=0;
		float temp[]=new float [right-left+1];
		while(i<=mid && j<=right) {		//采用升序排序。
			if(sort_array[i]<=sort_array[j]) {
				temp[k++]=sort_array[i++];
			}
			else {          //跳至这不说明满足逆序对条件。
				count+=mid-i+1;     //计算当前片段序列的逆序对
				temp[k++]=sort_array[j++];
			}
		}
		while(i<=mid) {temp[k++]=sort_array[i++];}
		while(j<=right) {temp[k++]=sort_array[j++];}
		for (int f=0;f<k;f++) {
			sort_array[left++]=temp[f];	
		}
		return count;
	}

}

结语:所有代码均通过测试,有什么问题,欢迎回复。

猜你喜欢

转载自blog.csdn.net/weixin_43629719/article/details/88384175