【问题标题】:How to check if array is already sorted如何检查数组是否已经排序
【发布时间】:2013-08-09 07:01:26
【问题描述】:

那么如何做出这样的逻辑

int[] arr = {2, 5, 3};

if (/* arr is sorted */)
    ....
else 
    ...

Array.sort 方法无效

【问题讨论】:

  • 数组没有排序怎么办?
  • 您必须编写自己的逻辑。遍历数组,并用下一个元素测试每个元素。
  • 没什么,我只需要以某种方式检查 arr 是否已排序
  • 您还能如何检查数组是否已排序?
  • Arrays.sort 对数组进行排序。它不检查数组是否已排序。

标签: java arrays sorting


【解决方案1】:

您无需对数组进行排序即可检查它是否已排序。遍历每对连续的元素并检查第一个是否小于第二个;如果你找到一个不符合条件的对,则数组不会排序。

boolean sorted = true;

for (int i = 0; i < arr.length - 1; i++) {
    if (arr[i] > arr[i+1]) {
        sorted = false;
        break;
    }
}

【讨论】:

  • 不可能更快。显然,您必须至少查看所有元素一次。如果您不查看所有内容,您还能如何分享?
  • @OxomHuK 您可以将所有这些放在一个函数中,然后调用它。更少的代码并不总是意味着更好。
  • @Elist 你为什么要使用它?你会失去短路能力。
  • 投反对票的人可能是嫉妒。很好的答案。简单高效。
  • @Elist 每次迭代只允许你访问数组的一个元素,我们需要访问两个。
【解决方案2】:
public static <T>
boolean isArraySorted(T[] elements, Comparator<? super T> cmp) {
  int n = elements.length;
  for (int i = 1; i < n; ++i) {
    if (cmp.compare(elements[i-1], elements[i]) > 0) { return false; }
  }
  return true;
}

【讨论】:

  • +1 使用泛型... 非常好的玩具,但我相信,我从来不需要询问数组是否已经排序。
  • 这太棒了,你是即时想出来的还是把它藏在某个地方哈哈?我希望后者适合我脆弱的自我,干得好。 +1
  • 实际上没有必要提取长度,除非进行解释。
  • 请注意,这不适用于 OP 的示例,因为他想检查一组原语。在理想情况下,每个原始数组类型都有一个类似的方法。
  • @arshajii,好点。我认为这是一个一次性的示例,但要使其真正通用,我必须使用java.lang.reflect.Array@SuppressWarnings("unchecked"),这将破坏您从编译器获得的所有通用安全检查。我认为基元类型的重载是个好主意。
【解决方案3】:

你可以在 O(n) 最坏情况线性时间内检查它。 未排序的数组(假设您的意思是按升序排序)将有一个触发点。那是在某个时候 arr[i] > arr[i+1]

你需要做的就是

boolean is_array_sorted(int arr[]) {
  for(int i=0; i < arr.len-1; i++) {
    if(arr[i] > arr[i+1]) {
       return false;
    }
  }
  return true;
}

如果您的数组排序应该是降序排列,只需将 &gt; 更改为 &lt;

【讨论】:

    【解决方案4】:
    public static boolean isSorted(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            if (a[i + 1] < a[i]) {
                return false;
            };
        }
        return true;
    }
    

    【讨论】:

    • 应该是 arr.length,而不是 arr.length()
    【解决方案5】:
    function isArraySorted(arr) {
        for (let i=0;i<arr.length;i++) {
            if (arr[i+1] && (arr[i+1] > arr[i])) {
                continue;
            } else if(arr[i+1] && (arr[i+1] < arr[i])) {
                return false;
            }
        }
    
        return true;
    }
    

    这对我有用。

    【讨论】:

      【解决方案6】:

      更短的版本:

      [0,1,2,3,4].reduce((a,v) => (a!==false) && (a <= v) ? v : false, -Infinity)
      [4,3,1,2,0].reduce((a,v) => (a!==false) && (a >= v) ? v : false, +Infinity)
      

      小心,因为在某些情况下它无效,因为它会循环整个数组而不会过早中断。

      Array.prototype.reduce()

      【讨论】:

      • 非常有帮助的答案,但是,错误的编程语言。 Java 与 javascript 不同。
      • @JackGiffin,Java 得到了正确的流,你可以使用 reduce() 就好了
      【解决方案7】:

      您可以使用.every

      let isSorted = array.every((v, i) => (i === 0 || v <= array[i - 1]))
        || array.every((v, i) => (i === 0 || v >= array[i - 1]))
      

      【讨论】:

        【解决方案8】:

        the generics versionMike Samuel 略有不同,但使用 Comparable&lt;T&gt; 而不是 Comparator&lt;T&gt;

        public static <T extends Comparable<? super T>> boolean isSorted(T[] elements) {
            int n = elements.length;
            for (int i = 1; i < n; ++i) {
                if (elements[i - 1].compareTo(elements[i]) > 0) {
                    return false;
                }
            }
            return true;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2018-04-10
          • 2019-01-07
          • 2018-12-18
          • 2016-09-23
          • 2020-06-04
          • 1970-01-01
          相关资源
          最近更新 更多