Вступ до сортування алгоритмів на Java

Сортувати інформацію в певному порядку, часто в рамках, схожих на масив, - це їх упорядкувати. Можна використовувати різні вимоги до послідовності, популярними є сортування чисел від найменших до найбільших або навпаки, або лексикографічно сортування рядків. Ми розглянемо різні алгоритми, починаючи від неефективних, але інтуїтивно зрозумілих альтернатив, до ефективних алгоритмів, які ефективно реалізуються на Java та іншими мовами, якщо вас цікавить, як сортування працює.

Різні алгоритми сортування в Java

Існують різні алгоритми сортування, і не всі вони однаково ефективні. Для того, щоб порівняти їх і побачити, які з них працюють найкраще, ми проаналізуємо їх часові складності.

  1. Сортування вставки
  2. Сортування бульбашок
  3. Сортування вибору
  4. Об’єднати сортування
  5. Гіпсорт

1. Сортування вставки

Концепція сортування вставки поділяє діапазон на підрядні масиви, відсортовані та несортовані. Класифікована частина знаходиться на початку тривалості 1 і відповідає першому (лівій стороні) компоненту в масиві. Просуваємося через масив і розгортаємо класифіковану частину масиву на один компонент під час кожної ітерації. Коли ми розгортаємо, ми розміщуємо свіжий елемент у відсортованому підмасиві. Ми робимо це, переміщуючи всі елементи праворуч, поки не виявимо, що нам не доведеться змінювати перший компонент. Коли жирна частина сортується у порядку зростання, наприклад, у наступному масиві, це відбувається:

  1. 3 5 7 8 4 2 1 9 6: Розглянемо 4 і вставити це те, що нам потрібно. Ми переміщуємось з 8> 4
  2. 2. 3 5 7 x 8 2 1 9 6
  3. 3 5 х 7 8 2 1 9 6
  4. 3 х 5 7 8 2 1 9 6
  5. 3 4 5 7 8 2 1 9 6

Код:

public class InsertionSortEx (
public static void insertionSort(int() arr) (
for (int x = 1; x < arr.length; x++) (
int current = arr(x);
int y = x - 1;
while(y >= 0 && current < arr(y)) (
arr(y+1) = arr(y);
y--;
)
arr(y+1) = current;
)
)
public static void main(String a())(
int() arr1 = (3, 5, 7, 8, 4, 2, 1, 9, 6);
System.out.println("Before Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
System.out.println();
insertionSort(arr1);//sorting array using insertion sort
System.out.println("After Insertion Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
)
)

Вихід:

Слідом за цим методом один компонент розширив відсортовану частину, тепер у нас п'ять замість чотирьох елементів. Кожна ітерація робить це, і весь масив буде відсортований до кінця.

Примітка. Це тому, що нам потрібно перенести весь класифікований список по одному в кожній ітерації, яка є O (n). Для кожного компонента кожної таблиці ми маємо це зробити, з чого випливає, що він обмежений O (n 2).

2. Сортування бульбашок

Якщо міхур не в потрібному порядку, він працює, замінюючи сусідні компоненти. Це повторюється до тих пір, поки всі компоненти не будуть у порядку від початку масиву. Ми знаємо, що якщо нам вдасться виконати всю ітерацію без свопів, всі елементи порівняно з їх суміжними елементами були в бажаному порядку і, в розширенні, весь масив. Причина алгоритму сортування бульбашок полягає в тому, що числа, як "бульбашки вгору", переходять у "землю". Якщо після певної кількості ви знову пройдете екземпляр (4 - хороший екземпляр), ви помітите, що число повільно рухається вправо.

Кроки до сортування бульбашок такі:

  1. 4 2 1 5 3: Тут перші два числа не в правильному порядку, отже, ми повинні сортувати обидва числа.
  2. 2 4 1 5 3: Після цього наступна пара номерів також не в потрібному порядку. Тож сортування відбувається знову.
  3. 2 1 4 5 3: Ці два в правильному порядку, 4 <5, отже, не потрібно їх міняти місцями.
  4. 2 1 4 5 3 : Знову ми маємо поміняти місцями для належного замовлення.
  5. 2 1 4 3 5: Ось отриманий масив після однієї ітерації.
  6. Ми повинні повторити цей процес ще раз, поки цифри не будуть в належному порядку.

Код:

public class BubbleSortExample (
public static void bubbleSort(int() arr) (
int n = arr.length;
int tmp = 0;
for(int x=0; x < n; x++)(
for(int y=1; y < (nx); y++)(
if(arr(y-1) > arr(y))(
//swap elements
tmp = arr(y-1);
arr(y-1) = arr(y);
arr(y) = tmp;
)
)
)
)
public static void main(String() args) (
int arr() =(4, 2, 1, 5, 3);
System.out.println("Array Before Bubble Sort");
for(int x=0; x < arr.length; x++)(
System.out.print(arr(x) + " ");
)
System.out.println();
bubbleSort(arr);
System.out.println("Array After Bubble Sort");
for(int x=0; x < arr.length; x++)(
System.out.print(arr(x) + " ");
)
)
)

Вихід:

Примітка. Це могло б опинитися в нескінченному циклі, якби я використовував (i)> = a (i + 1), оскільки це з'єднання все-таки було б дійсним з еквівалентними компонентами і, таким чином, завжди міняв їх з одного елемента на інший.

3. Сортування вибору

Вибір Сортування розбиває масив на масив класифікацій, які не відсортовані. Цього разу, проте, підрядна частина сортування формується, вставляючи в кінці відсортованого масиву мінімальний елемент несортованого підмножини шляхом заміни:

  1. 3 5 1 2 4
  2. 1 5 3 2 4
  3. 1 2 3 5 4
  4. 1 2 3 5 4
  5. 1 2 3 4 5
  6. 1 2 3 4 5

Код:

public class SelectionSortEx (
public static void selectionSort(int() arr)(
for (int x = 0; x < arr.length - 1; x++)
(
int indx = x;
for (int y = x + 1; y < arr.length; y++)(
if (arr(y) < arr(indx))(
indx = y;
)
)
int smallNumber = arr(indx);
arr(indx) = arr(x);
arr(x) = smallNumber;
)
)
public static void main(String a())(
int() arr1 = (3, 5, 1, 2, 4);
System.out.println("Before Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
System.out.println();
selectionSort(arr1);
System.out.println("After Selection Sorting");
for(int x:arr1)(
System.out.print(x+" ");
)
)
)

Вихід:

Примітка: Мінімальний показник O (n) для розміру масиву, оскільки всі компоненти повинні бути перевірені. Для кожного елемента масиву ми повинні знайти мінімум і зробити весь процес O (n 2) обмеженим.

4. Злиття сортування

Об'єднання Сортування використовує рекурсію, щоб виправити проблему методу розділення та підкорення більш ефективно, ніж описані раніше алгоритми.

Це дерево показує, як функціонують рекурсивні дзвінки. Позначені стрілками масиви стрілками вниз - це масиви, для яких ми викликаємо функцію, коли ми з'єднуємо масиви стрілок. Потім ви стежите за стрілкою до краю дерева, а потім повертаєтесь і зливаєтеся. У нас є 3 5 3 1 діапазон, тому ми розділили його на 3 5 4 і 2 1. Ми розділили їх на їх частини, щоб сортувати їх. Ми починаємо злиття та сортування їх у міру того, як ми йдемо до дна.

Код:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class MergeSort (
static void merge(int() array, int lowval, int midval, int highval)(
int x, y, k;
int() c= new int(highval-lowval+1);
k = 0;
x=lowval;
y=midval+1;
while(x<=midval && y<=highval)(
if(array(x)<=array(y))(
c(k++) = array(x++);
)
else(
c(k++) = array(y++);
)
)
while(x<=midval)(
c(k++) = array(x++);
)
while(y<=highval)(
c(k++) = array(y++);
)
k=0;
for(x = lowval; x<=highval; x++)(
array(x) = c(k++);
)
)
static void mergeSort(int() array, int lowval, int highval)(
if(highval-lowval+1>1)(
int midval = (lowval+highval)/2;
mergeSort(array, lowval, midval);
mergeSort(array, midval+1, highval);
merge(array, lowval, midval, highval);
)
)
public static void main(String() args) (
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
int size;
System.out.println("Enter the array");
try (
size = Integer.parseInt(r.readLine());
) catch (Exception e) (
System.out.println("Please Enter valid Input");
return;
)
int() array = new int(size);
System.out.println("Enter array elements");
int x;
for (x = 0; x < array.length; x++) (
try (
array(x) = Integer.parseInt(r.readLine());
) catch (Exception e) (
System.out.println("An error Occurred");
)
)
System.out.println("After Sorting");
System.out.println(Arrays.toString(array));
mergeSort(array, 0, array.length-1);
System.out.println("Before Merge Sorting");
System.out.println(Arrays.toString(array));
)
)

У цій програмі ми попросили користувача ввести дані. Вихід буде відсортований в залежності від введення користувача.

Вихід:

5. Купольний сорт

Спочатку ви повинні знати основу, на якій працює Heapsort - купу, щоб зрозуміти, чому вона працює. Ми спеціально поговоримо про двійкову купу, але ви також можете узагальнити це на інші конструкції купи. Купа - це дерево, яке відповідає властивості купи, а саме те, що всі його діти мають стосунки до кожного вузла. Купа також повинна бути майже закінчена. Бінарний код майже повної глибини має піддерево d-1, з тим самим коренем, і кожен вузол має повне, ліве піддерево, з лівим низхідним.

Іншими словами, ви отримуєте все меншу і меншу кількість (хв-куча) або більша і більша (макс-купа) при русі вниз по дереву. Ось екземпляр max-heap:

  1. 6 1 8 3 5 2 4 : Тут обидва дитячі номери менші від батьківських, отже, нам нічого не потрібно міняти.
  2. 6 1 8 3 5 2 4: Тут, 5> 1, нам потрібно їх поміняти. Нам потрібно підкреслити 5.
  3. 6 5 8 3 1 2 4: Обидва дитячі номери менші, все залишається однаковим.
  4. 6 5 8 3 1 2 4: Тут 8> 6, отже, ми повинні їх поміняти.
  5. 8 5 6 3 1 2 4: Після цієї ітерації ми отримаємо цей результат.

Після повторення цього процесу ми отримаємо такі результати:

  • 8 5 6 3 1 2 4
  1. 4 5 6 3 1 2 8 : Обмін
  2. 6 5 4 3 1 2 8 : Надихати
  3. 2 5 4 3 1 6 8 : Обмін
  4. 5 2 4 2 1 6 8 : Надихайте
  5. 1 2 4 2 5 6 8 : Обмін

Код:

public class HeapSort
(
public void sort(int arr())
(
int n = arr.length;
for (int x = n / 2 - 1; x >= 0; x--)
heapify(arr, n, x);
for (int x=n-1; x>=0; x--)
int tmp = arr(0);
arr(0) = arr(x);
arr(x) = tmp;
heapify(arr, x, 0);
)
)
void heapify(int arr(), int n, int x)
(
int largest = x;
int L = 2*x + 1;
int r = 2*x + 2;
if (L arr(largest))
largest = L;
if (r arr(largest))
largest = r;
if (largest != x)
(
int swap = arr(x);
arr(x) = arr(largest);
arr(largest) = swap;
heapify(arr, n, largest);
)
)
static void printArray(int arr())
(
int n = arr.length;
for (int x=0; x System.out.print(arr(x)+" ");
System.out.println();
)
public static void main(String args())
(
int arr() = (6, 1, 8, 3, 5, 2, 4);
int n = arr.length;
System.out.println("Before Sorting:");
printArray(arr);
HeapSort ob = new HeapSort();
ob.sort(arr);
System.out.println("After Heap Sorting:");
printArray(arr);
)
)
public class HeapSort
(
public void sort(int arr())
(
int n = arr.length;
for (int x = n / 2 - 1; x >= 0; x--)
heapify(arr, n, x);
for (int x=n-1; x>=0; x--)
int tmp = arr(0);
arr(0) = arr(x);
arr(x) = tmp;
heapify(arr, x, 0);
)
)
void heapify(int arr(), int n, int x)
(
int largest = x;
int L = 2*x + 1;
int r = 2*x + 2;
if (L arr(largest))
largest = L;
if (r arr(largest))
largest = r;
if (largest != x)
(
int swap = arr(x);
arr(x) = arr(largest);
arr(largest) = swap;
heapify(arr, n, largest);
)
)
static void printArray(int arr())
(
int n = arr.length;
for (int x=0; x System.out.print(arr(x)+" ");
System.out.println();
)
public static void main(String args())
(
int arr() = (6, 1, 8, 3, 5, 2, 4);
int n = arr.length;
System.out.println("Before Sorting:");
printArray(arr);
HeapSort ob = new HeapSort();
ob.sort(arr);
System.out.println("After Heap Sorting:");
printArray(arr);
)
)

Вихід:

Ви можете переглянути його від точки до рівня графіка, зліва направо. Що ми тут досягли, це те, що коли у нас є k-й компонент у масиві, позиція його дітей дорівнює 2 \ * k + 1 та 2 \ * k + 2 (якщо припустити, що індексація починається з 0). Це ви можете контролювати. Положення батьків завжди є (k-1) / 2 для k-го компонента. Ви можете легко “максимізувати” будь-який діапазон, тому що це знаєте. Перевірте, чи один з його дітей нижче, ніж у кожного компонента. Якщо так, з’єднайте одного з батьків і повторіть цей крок рекурсивно з батьком.

Примітка: Оскільки ітерація for-циклів у всьому масиві робить heapSort) (очевидно, O (N), це створило б загальну складність Heapsort O (nlog n). Heapsort має тип на місці, що означає, що йому потрібен O ​​( 1) більше місця, ніж Merge Sort, але це має деякі недоліки, наприклад, важкі паралелі.

Висновок - сортування алгоритмів у Java

Сортування - це дуже поширена процедура для наборів даних, чи то для подальшого аналізу, прискорення пошуку з більш ефективними алгоритмами, спираючись на відсортовану інформацію, фільтруючу інформацію тощо. Сортування підтримується декількома мовами, а часто інтерфейси затьмарюють те, що робить програміст.

Рекомендовані статті

Це посібник зі сортування алгоритмів на Java. Тут ми обговорюємо різні типи сортування на Java разом з їх алгоритмами. Ви також можете ознайомитися з іншими запропонованими нами статтями -

  1. Об’єднайте алгоритми сортування в Java
  2. JComboBox на Java
  3. StringBuffer на Java
  4. JTextField на Java
  5. Сортування купи в Python
  6. Швидке сортування алгоритмів на Java
  7. Повне керівництво по сортуванню в C # з прикладами
  8. Сортування алгоритмів у JavaScript
  9. Посібник з прикладів алгоритму С ++
  10. Повне керівництво по сортуванню алгоритмів в Python