package day03;
public class Suan02SmallSum {
/*
* 基于归并排序的第一道题,找小和
* 思路:归并排序的两段比较,因为每次两段都是排好序了,之后进行比较,所以找到左面比它
* */
public static int mergeSort(int[] arr,int left,int right){
if(left == right){
return 0;
}
int mid = left + ((right - left)>>1);
return mergeSort(arr,left,mid)+
mergeSort(arr,mid+1,right)+
merge(arr,left,mid,right);
}
public static int merge(int[] arr,int left,int mid, int right){
int L = left;
int R = mid + 1;
int[] help = new int[right-left+1];
int count = 0;
int sum = 0;
while(L <= mid && R <= right){
if(arr[L]<arr[R]){
//两数相等先拷贝右边的数,这样才能算出有多少个大于左边的
//比归并排序多了一步,只要比检测到左边比右边小的,直接就用左边的数乘上右边比它大的数,即R-right位置上的所有数(因为顺序排列)
sum += arr[L]*(right-R+1);
help[count++] = arr[L++];
}else {
help[count++] = arr[R++];
}
}
while(L <= mid){
help[count++] = arr[L++];
}
while (R <= right){
help[count++] = arr[R++];
}
for (int i = 0; i < help.length; i++) {
arr[i+left] = help[i];
}
return sum;
}
public static int violent(int[] arr,int left,int right){
if(arr == null || arr.length == 1){
return 0;
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
if(arr[i] < arr[j]){
sum += arr[i];
}
}
}
return sum;
}
public static void main(String[] args) {
int[] arr = {1,2,12,13};
System.out.println(mergeSort(arr,0,3));
System.out.println(violent(arr,0,3));
}
}
找小和-基于归并排序java
最新推荐文章于 2024-09-23 15:50:28 发布