Java 在运行时O(n logn)中比较数组的每个元素

Java 在运行时O(n logn)中比较数组的每个元素,java,arrays,performance,Java,Arrays,Performance,我必须检查每个元素是否有大于数组中的元素。这意味着数组必须按降序排序。如果存在任何大于当前元素的元素,则我必须将该数字计算为数组中存在的大于我正在检查的当前元素的数字。这样,我必须检查每个元素。我的输出必须是元素大于当前元素的总次数(考虑数组的每个元素) 问题是我必须用O(n logn)来做。我可以用简单的方法来做,但是运行时间是O(n^2) 公共类CountPairs{ 公共静态整数对(int[]arr){ 整数对=0; 对于(inti=0;i假设数组确实已排序,则可以用二进制搜索替换内部循环

我必须检查每个元素是否有大于数组中的元素。这意味着数组必须按降序排序。如果存在任何大于当前元素的元素,则我必须将该数字计算为数组中存在的大于我正在检查的当前元素的数字。这样,我必须检查每个元素。我的输出必须是元素大于当前元素的总次数(考虑数组的每个元素)

问题是我必须用O(n logn)来做。我可以用简单的方法来做,但是运行时间是O(n^2)

公共类CountPairs{
公共静态整数对(int[]arr){
整数对=0;

对于(inti=0;i假设数组确实已排序,则可以用二进制搜索替换内部循环。 请参阅java.util.Arrays#binarySearch

如果不确定数组是否已真正排序,则可以在线性时间内进行检查: 如果元素i+1大于元素i,则数组不按降序排序。
在那个时候,你可以用数组数组来排序O(n log(n))。

我会考虑使用一个树,尽管有一些改进运行时的方法,但是二进制搜索树看起来可以工作。你的数组中是否允许重复?因为如果不是,定义所有元素<代码>列表[0 ] < /代码>…代码>列表[I-1 ]。
大于排序后任何
i
list[i]
,使用二进制搜索查找任何给定数字的
i
需要
log(n)
public class CountPairs {
       public static int countPairs(int[] arr) {
           int Pairs=0;
           for (int i=0;i<arr.length;i++){
               for (int j=i+1;j<arr.length;j++){
                    if (arr[i] < arr[j]){
                         Pairs++;
                    }
               }
           }
           return Pairs;
      }
   }