如何检查数组是否已经排序

问题描述 投票:6回答:6

那么如何制作这样的逻辑呢

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

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

它的方法Array.sort是无效的

java arrays sorting
6个回答
30
投票

您不需要对数组进行排序以检查它是否已排序。循环遍历每个连续的元素对,并检查第一个元素是否小于第二个元素;如果找到一个不成对的对,则不对数组进行排序。

boolean sorted = true;

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

11
投票
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;
}

2
投票

那么你可以在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;
}

如果你的数组排序应该是降序,只需将>更改为<


1
投票
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;
}

0
投票

更短的版本:

[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()


0
投票

你可以使用.every

let isSorted = array.every((v, i) => (i === 0 || v <= array[i - 1]))
  || array.every((v, i) => (i === 0 || v >= array[i - 1]))
© www.soinside.com 2019 - 2024. All rights reserved.