数组小和,归并排序实现

简介: 数组小和,归并排序实现

在一个数组中,一个数左边比它小的数的总和,叫数的小和,所有数的小和累加起来,叫数组小和,求数组小和,可以利用归并排序

package com.harrison.class03;
public class Code02_SmallSum {
  public static int smallSum(int[] arr) {
    if (arr == null || arr.length < 2) {
      return 0;
    }
    return process(arr, 0, arr.length - 1);
  }
  public static int process(int[] arr, int L, int R) {
    if (L == R) {
      return 0;
    }
    int mid = L + ((R - L) >> 1);
    return process(arr, L, mid)+
        process(arr, mid + 1, R)+
        merge(arr, L, mid, R);
  }
  public static int merge(int[] arr, int L, int M, int R) {
    int[] help = new int[R - L + 1];
    int i = 0;
    int p1 = L;
    int p2 = M + 1;
    int res=0;
    while (p1 <= M && p2 <= R) {
      res+=arr[p1]<arr[p2]?arr[p1]*(R-p2+1):0;
      help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
    }
    while (p1 <= M) {
      help[i++] = arr[p1++];
    }
    while (p2 <= R) {
      help[i++] = arr[p2++];
    }
    for (i = 0; i < help.length; i++) {
      arr[L+i] = help[i];
    }
    return res;
  }
  public static int comparator(int[] arr) {
    int res=0;
    if(arr==null || arr.length<2) {
      return 0;
    }
    for(int i=1; i<arr.length;  i++) {
      for(int j=0; j<i; j++) {
        res+=arr[j]<arr[i]?arr[j]:0;
      }
    }
    return res;
  }
  public static int[] generateRandomArray(int maxSize, int maxValue) {
    int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
    for (int i = 0; i < arr.length; i++) {
      arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
    }
    return arr;
  }
  public static int[] copyArray(int[] arr) {
    if (arr == null) {
      return null;
    }
    int[] res = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
      res[i] = arr[i];
    }
    return res;
  }
  public static void printArray(int[] arr) {
    if (arr == null) {
      return;
    }
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
    System.out.println();
  }
  public static void main(String[] args) {
    int testTimes=1000000;
    int maxSize=100;
    int maxValue=100;
    boolean succeed=true;
    for(int i=0; i<testTimes; i++) {
      int[] arr1=generateRandomArray(maxSize, maxValue);
      int[] arr2=copyArray(arr1);
      if(smallSum(arr1)!=comparator(arr2)) {
        succeed=false;
        printArray(arr1);
        printArray(arr2);
        break;
      }
    }
    System.out.println(succeed?"Nice":"Fucking fucked");
  }
}
相关文章
|
6月前
|
存储 搜索推荐 算法
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
|
6月前
|
搜索推荐 容器
数组中的冒泡排序与选择排序
数组中的冒泡排序与选择排序
LetCode第912题 排序数组之冒泡排序
依次比较相邻的两du个数,将小数放在前面zhi,大数放在后面。即首先比较第dao1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。
52 0
LetCode第912题 排序数组之冒泡排序
|
搜索推荐 算法 编译器
【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序
【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序
46 0
|
算法
【快速排序】快速排序/第k个数
【快速排序】快速排序/第k个数
|
算法 搜索推荐 Java
数组的四种排序方法介绍
数组的四种排序方法介绍
294 0
|
存储 算法 搜索推荐
LeetCode:215. 数组中的第K个最大元素——快速排序
题目描述:给定整数数组nums和整数** k**,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
|
存储 编译器 C语言
【C】数组+冒泡排序
【C】数组+冒泡排序
134 0
【C】数组+冒泡排序
|
人工智能 C++
数组排序之桶排序
利用一维数组的知识简单实现桶排序,即对计算机随机读入的0-20之间的5个数从小到大排序
64 0