2013-08-07 7 views
4

так как сделать такую ​​логикуКак проверить, если массив уже отсортирован

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

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

Его плохо, что метод Array.sort недействительна

+3

Что вы собираетесь делать, если массив не отсортирован? – supersam654

+0

Вы должны написать свою собственную логику. Итерации по массиву и проверка каждого элемента на следующий элемент. –

+0

ничего, мне просто нужно как-то проверить, сортируется ли сортировка или нет – OxomHuK

ответ

20

Вам не нужно сортировать массив, чтобы проверить, если это отсортирован. Перебирайте по каждой последовательной паре элементов и проверьте, не меньше ли первого; если вы найдете пару, для которой это не так, массив не сортируется.

boolean sorted = true; 

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

loop is okey, но не здесь что-то еще быстрее, например, равное нашему arr с отсортированным arr – OxomHuK

+0

@OxomHuK Как вы находите отсортированный массив? –

+0

@OxomHuK Если «быстрее» означает более эффективное: нет. – arshajii

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

+1 Используйте дженерики ... Очень хорошая игрушка, но, я считаю, мне никогда не нужно спрашивать, отсортирован ли массив. –

+1

Это здорово, вы придумали его на лету или его спрятали где-нибудь в LOL? Я надеюсь, что последнее для моего хрупкого эго, хорошая работа. +1 –

+0

Исчерпывающая длина действительно не нужна, хотя и не интерпретируется. –

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

должен быть длиной arr.length, не arr.length() – ajb

2

Ну вы можете проверить это в O (N) в худшем случае линейное время. Не отсортированный массив (при условии, что вы имеете в виду сортировку в порядке возрастания) будет иметь точку отключения. То есть в какой-то момент обр [я]> обр [я + 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

Сокращенный вариант:

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

Будьте осторожны:

  1. Вы должны знать максимальное или минимальное значение массива.
  2. В некоторых случаях это не эффективно, потому что он будет зацикливать весь массив без перерыва преждевременно.

Array.prototype.reduce()

Смежные вопросы