Проверка дали даден масив е сортиран в Java

1. Общ преглед

В този урок ще видим различни начини да проверим дали масивът е сортиран.

Преди да започнете обаче, би било интересно да проверите как да сортирате масиви в Java.

2. С бримка

Един от начините за проверка е чрез цикъл for . Можем да повторим всички стойности на масива една по една.

Нека да видим как да го направим.

2.1. Примитивен масив

Просто казано, ще повторим всички позиции, освен последната. Това е така, защото ще сравним една позиция със следващата.

Ако някои от тях не са сортирани, методът ще върне false. Ако нито едно от сравненията не върне false, това означава, че масивът е сортиран:

boolean isSorted(int[] array) { for (int i = 0; i  array[i + 1]) return false; } return true; }

2.2. Обекти, които се изпълняват, сравними

Можем да направим нещо подобно с обекти, които изпълняват сравним. Вместо да използваме знак по-голям от, ще използваме compareTo :

boolean isSorted(Comparable[] array) { for (int i = 0; i  0) return false; } return true; }

2.3. Обекти, които не се изпълняват, сравними

Но какво ще стане, ако нашите обекти не изпълняват сравними ? В този случай вместо това можем да създадем компаратор.

В този пример ще използваме обекта Employee . Това е просто POJO с три полета:

public class Employee implements Serializable { private int id; private String name; private int age; // getters and setters }

След това трябва да изберем от кое поле искаме да поръчаме. Ето, нека подредим по възрастово поле:

Comparator byAge = Comparator.comparingInt(Employee::getAge);

И тогава, можем да променим метода си, за да вземем и сравнителен :

boolean isSorted(Object[] array, Comparator comparator) { for (int i = 0; i  0) return false; } return true; }

3. Рекурсивно

Вместо това можем, разбира се, да използваме рекурсия. Идеята тук е, че ще проверим две позиции в масива и след това ще повторим, докато не проверим всяка позиция.

3.1. Примитивен масив

При този метод проверяваме последните две позиции. Ако са сортирани, ще извикаме метода отново, но с предишна позиция. Ако една от тези позиции не е сортирана, методът ще върне false:

boolean isSorted(int[] array, int length)  length  array[length - 1]) return false; return isSorted(array, length - 1); 

3.2. Обекти, които се изпълняват, сравними

Сега, нека да погледнем отново като обекти, които изпълняват сравним. Ще видим, че същият подход с compareTo ще работи:

boolean isSorted(Comparable[] array, int length) 

3.3. Обекти, които не се изпълняват, сравними

Напоследък нека опитаме отново обекта на служител , като добавим параметъра Comparator :

boolean isSorted(Object[] array, Comparator comparator, int length)  if (array == null 

4. Заключение

В този урок видяхме как да проверим дали масивът е сортиран или не. Видяхме както итеративни, така и рекурсивни решения.

Нашата препоръка е да използвате цикличното решение. По-чист е и по-лесен за четене.

Както обикновено, изходният код от този урок може да бъде намерен в GitHub.