zoukankan      html  css  js  c++  java
  • 小和问题、逆序对问题

    面试常考:归并排序的思想(分治)

    image

    import java.util.Arrays;
    
    //小和问题
    public class SmallSort {
    
        public static void main(String[] args) {
            int[] arr = {1,3,4,2,5};
            System.out.println(Arrays.toString(arr));
    //        merge(arr, 0, 3, arr.length-1);
            int res = mergeSort(arr, 0, arr.length-1);
            System.out.println(res);
        }
        
        //归并排序
        public static int mergeSort(int[] arr,int low, int heigh){
            if (low>=heigh) {
                return 0;
            }
            int mid = (low+heigh)/2;
    //        if (low<heigh) {
    //            //处理第一个数组
    //            mergeSort(arr, low, mid);
    //            //处理第二个数组
    //            mergeSort(arr, mid+1, heigh);
    //            //归并
    //            merge(arr, low, mid, heigh);
                //return mergeSort(arr, low, mid)+mergeSort(arr, mid+1, heigh)+merge(arr, low, mid, heigh);
                
    //        }
            return mergeSort(arr, low, mid)+mergeSort(arr, mid+1, heigh)+merge(arr, low, mid, heigh);
            
        }
        
        //将两个排好序的数组合并,在合并的过程中求小和
        public static int merge(int[] arr,int low,int mid ,int heigh){
            //第一个数组的下标
            int i = low;
            //第二个数组的下标
            int j = mid+1;
            //新数组
            int[] temp = new int[heigh-low+1];
            //新数组的下标
            int k = 0;
            //小和
            int res = 0;
            
            while (i<=mid&&j<=heigh) {
                if (arr[i]<arr[j]) {
                    temp[k++] = arr[i];
                    res =res + arr[i]*(heigh-j+1);
                    i++;
                }else {
                    temp[k++] = arr[j++];
                }
            }
            
            //某个数组还没有放完
            while (i<=mid) {
                temp[k++] = arr[i++];
            }
            while (j<=heigh) {
                temp[k++] = arr[j++];
            }
            
            //最后把排好序的temp赋给arr
            for (int m=0;m<temp.length;m++){
                arr[low+m] = temp[m];
            }
            return res;
        }
    }
  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/yuange678/p/10816200.html
Copyright © 2011-2022 走看看