计算数组的小和

来源:互联网 发布:筛子目的算法 编辑:程序博客网 时间:2024/05/05 03:59
/** * Created by lxw, liwei4939@126.com on 2017/11/3. * 计算数组的小和 * 归并排序 */public class arraySmallSum {    public int getSmallSum(int[] arr){        if(arr ==null || arr.length == 0){            return 0;        }        return fun(arr, 0, arr.length - 1);    }    public int fun(int[] s, int l, int r){        if(l == r){            return  0;        }        int mid = (l + r) /2;        return fun(s, l, mid) + fun(s, mid + 1, r) + merge(s, l, mid, r);    }    public int merge(int[] s, int left, int mid, int right){        int[] h = new int[right - left + 1];        int hi = 0;        int i = left;        int j =mid + 1;        int smallSum = 0;        while (i<= mid && j <= right){            if(s[i] <= s[j]){                smallSum += s[i] * (right - j  +1);                h[hi++] = s[i++];            } else {                h[hi++] = s[j++];            }        }        for (; (j < right + 1) || (i < mid +1); i++, j++){            h[hi++] = i > mid ? s[j] : s[i];        }        for (int k=0; k< h.length; k++){            s[left++] = h[k];        }        return smallSum;    }    public static void main(String[] args){        arraySmallSum tmp = new arraySmallSum();        int[] arr = {1, 3, 5, 2, 4, 6};        System.out.println(tmp.getSmallSum(arr));    }}

原创粉丝点击