簡體   English   中英

如何檢查數組是否已經排序

[英]How to check if array is already sorted

那么如何做出這樣的邏輯

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

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

Array.sort 方法無效,這很糟糕

您無需對數組進行排序即可檢查其是否已排序。 遍歷每對連續的元素,並檢查第一個是否小於第二個; 如果找到不正確的一對,則不對數組進行排序。

boolean sorted = true;

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

好吧,您可以在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;
}

如果您的數組排序應該是降序排列,只需將>更改為<

較短的版本:

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

您可以使用.every

let isSorted = array.every((v, i) => (i === 0 || v <= array[i - 1]))
  || array.every((v, i) => (i === 0 || v >= array[i - 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;
}

this worked for me.

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM