15

那么如何制作这样的逻辑

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

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

方法 Array.sort 无效,这很糟糕

4

8 回答 8

46

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

boolean sorted = true;

for (int i = 0; i < arr.length - 1; i++) {
    if (arr[i] > arr[i+1]) {
        sorted = false;
        break;
    }
}
于 2013-08-07T18:41:01.977 回答
13
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;
}
于 2013-08-07T18:42:10.903 回答
2
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;
}
于 2013-08-07T18:42:21.620 回答
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;
}

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

于 2013-08-07T18:43:38.487 回答
1

您可以使用.every

let isSorted = array.every((v, i) => (i === 0 || v <= array[i - 1]))
  || array.every((v, i) => (i === 0 || v >= array[i - 1]))
于 2019-02-14T02:51:02.860 回答
1
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;
}

这对我有用。

于 2019-09-20T05:46:26.390 回答
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()

于 2017-05-19T03:42:01.580 回答
0

Mike Samuel对泛型版本的轻微变化,但使用而不是:Comparable<T>Comparator<T>

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;
}
于 2021-11-29T04:03:56.797 回答