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;
        }
    }
  • 相关阅读:
    4.C#的选择语句练习
    3.C#中的选择语句
    java包静态导入,继承
    新的学期要继续学习喽
    桌球小游戏
    JAVA和C语言的区别
    BIV+CSS网页的标准化布局
    层叠样式表
    学PHP也要懂得HTML
    web开发入门
  • 原文地址:https://www.cnblogs.com/yuange678/p/10816200.html
Copyright © 2011-2022 走看看