什么是递归排序
递归排序是一种基于递归的排序算法,它通过将待排序的元素分解成更小的子问题,然后递归地解决这些子问题来实现排序。递归排序的基本思想是将待排序的元素分解成更小的子问题,然后递归地解决这些子问题,直到所有子问题都被解决为止。
###递归排序的基本步骤如下:
1.将待排序的元素分解成更小的子问题,例如将整数分解成整数和小数。
2.对于每个子问题,递归地解决它,直到所有子问题都被解决为止。
3.将所有子问题的解合并起来,得到最终的排序结果。
逆序对问题
问题描述:
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。
代码实现
public static int merge(int[]arr){
if (arr == null || arr.length < 2){
return 0;
}
return process(arr,0,arr.length - 1);
}
递归方法调用
public static int process(int[]arr,int L,int R){
//base case
if (L == R){
return 0;
}
int mid = L + ((R - L ) >> 1);
return process(arr,L,mid)+
process(arr,mid+1,R)
+mergeSort(arr,L,mid,R);
}
分治后合并的过程
public static int mergeSort(int[]arr,int L,int M,int R){
int p1 = M;
int p2 = R;
int ans = 0;
int[]help = new int[R - L + 1];
int i = help.length - 1;
while(p1 >= L && p2 > M){
ans += arr[p1] > arr[p2] ? (p2 - M) : 0;
help[i--]= arr[p1] > arr[p2] ? arr[p1--] : arr[p2--];
}
while (p1 >= L){
help[i--] = arr[p1--];
}
while (p2 > M){
help[i--] = arr[p2--];
}
for (i = 0; i < help.length;i++){
arr[L + i] = help[i];
}
return ans;
}