• 排序---归并排序及其衍生问题


    归并排序及其衍生问题

      归并方法将数组中两个已经排序的部分归并成一个。将一个大数组分成两个小数组去求解。因为每次都将问题对半分成两个子问题,这种对半分的算法复杂度一般为O(NlogN)。

    public class Sort{
        public static void mergeSort(int []arr){
            if(arr==null||arr.length<2)
                return ;
            mergeSort(arr,0,arr.length-1);
        }
        public static void mergeSort(int[]arr,int left,int right){
            if(left==right)
                return;
            int mid=left+(right-left)/2;
            mergeSort(arr,left,mid);
            mergeSort(arr,mid+1,right);
            merge(arr,left,mid,right);//合并
        }
        public static void merge(int []arr,int left,int mid,int right){
            int []temp=new int[right-left+1]; //辅助数组
            int k=0;
            int i=left;
            int j=mid+1;
            while(i<=mid&&j<=right){
                if(arr[i]<arr[j]){
                    temp[k++]=arr[i++];
                }else{
                    temp[k++]=arr[j++];
                }
            }
            while(i<=mid){
                temp[k++]=arr[i++];
            }
            while(j<=right){
                temp[k++]=arr[j++];
            }
            for(k=0;k<temp.length;k++){
                arr[left+k]=temp[k];
            }
        }
    }
    

      基于归并排序衍生出来的题目:小和问题和逆序对问题。

      小和问题指的是给定一个数组,数组中每个元素左边比其小的元素之和是多少。例如数组1.3.2.6.5,它的小和是1+1+1+3+2+1+3+2=14。

    代码如下:

    public class Sort{
        public static int smallSum(int []arr){
            if(arr==null||arr.length<2)
                return 0;
            return mergeSort(arr,0,arr.length-1);
        }
        public static int mergeSort(int []arr,int l,int r){
            if(l==r)
                return 0;
            int mid=l+((r-l)>>1);
            return mergeSort(arr,l,mid)+mergeSort(arr,mid+1,r)+merge(arr,l,mid,r);
        }
        public static int merge(int arr,int l,int mid ,int r){
            int []temp=new int[r-l+1];
            int k=0;
            int res=0;
            int i=l;
            int j=mid+1;
            while(i<=mid&&j<=r){
                res+=arr[i]<arr[j]?(r-j+1)*arr[i]:0;//计算小和
                temp[k++]=arr[i]<arr[j]?arr[i++]:arr[j++];
            }
            while(i<=m){
                temp[k++]=arr[i++];
            }
            while(j<=r){
                temp[k++]=arr[j++];
            }
            for(k=0;k<temp.length;k++){
                arr[l+k]=temp[k];
            }
            return res;
        }
    }
    
  • 相关阅读:
    python笔记第二节
    python笔记第一节
    hadoop 家族生态圈 小结
    JDBC:impala 连接DEMO
    关于excel表格的导入导出的工具类。(java 反射 excel)
    简单写了一个类似全文检索的帮助类。
    关于框架SSM中文乱码问题总结
    关于SpringMVC, bean对象中含有Date型变,改如何接收数据的问题。
    Nlog
    java手动编译
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11101811.html
Copyright © 2020-2023  润新知