1. Pengenalan
Dalam tutorial ini, kita akan mempelajari Selection Sort , melihat pelaksanaannya di Java, dan menganalisis kinerjanya.
2. Tinjauan Algoritma
Pemilihan Urutan bermula dengan elemen pada kedudukan 1 dari susunan yang tidak disusun dan mengimbas elemen seterusnya untuk mencari unsur terkecil . Setelah dijumpai, elemen terkecil ditukar dengan elemen di kedudukan 1.
Algoritma kemudian beralih ke elemen pada kedudukan ke-2 dan mengimbas melalui elemen seterusnya untuk mencari indeks elemen terkecil ke-2. Setelah dijumpai, elemen terkecil kedua ditukar dengan elemen di kedudukan ke-2.
Proses ini berterusan sehingga kita mencapai elemen n-1 dari array, yang meletakkan elemen terkecil n-1 pada kedudukan n-1. Unsur terakhir secara automatik berada di tempatnya, dalam lelaran ke-1, dengan itu menyusun susunan.
Kami menjumpai elemen terbesar dan bukannya elemen terkecil untuk menyusun susunan mengikut urutan menurun.
Mari lihat contoh susunan yang tidak disusun dan urutkan mengikut urutan menaik untuk memahami algoritma secara visual.
2.1. Satu contoh
Pertimbangkan susunan yang tidak disusun berikut:
int [] arr = {5, 4, 1, 6, 2}
Pengulangan 1
Dengan mempertimbangkan algoritma yang berfungsi di atas, kita mulakan dengan elemen di kedudukan 1 - 5 - dan mengimbas semua elemen seterusnya untuk mencari elemen terkecil - 1. Kemudian kita menukar elemen terkecil dengan elemen di kedudukan pertama.
Susunan array yang diubahsuai kelihatan seperti:
{1, 4, 5, 6, 2}
Jumlah perbandingan yang dibuat: 4
Pengulangan 2
Pada lelaran kedua, kita beralih ke elemen ke-2 - 4 - dan mengimbas elemen seterusnya untuk mencari elemen terkecil kedua - 2. Kemudian kita menukar unsur terkecil kedua dengan elemen di kedudukan ke-2.
Susunan yang diubah kini kelihatan seperti:
{1, 2, 5, 6, 4}
Jumlah perbandingan yang dibuat: 3
Terus serupa, kami mempunyai lelaran berikut:
Pengulangan 3
{1, 2, 4, 6, 5}
Jumlah perbandingan yang dibuat: 2
Pengulangan 4
{1, 2, 4, 5, 6}
Jumlah perbandingan yang dibuat: 1
3. Pelaksanaan
Mari kita melaksanakan Pemilihan Jenis menggunakan beberapa untuk gelung:
public static void sortAscending(final int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int minElementIndex = i; for (int j = i + 1; j arr[j]) { minElementIndex = j; } } if (minElementIndex != i) { int temp = arr[i]; arr[i] = arr[minElementIndex]; arr[minElementIndex] = temp; } } }
Sudah tentu, untuk membalikkannya kita boleh melakukan sesuatu yang serupa:
public static void sortDescending(final int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int maxElementIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[maxElementIndex] < arr[j]) { maxElementIndex = j; } } if (maxElementIndex != i) { int temp = arr[i]; arr[i] = arr[maxElementIndex]; arr[maxElementIndex] = temp; } } }
Dan dengan sedikit siku siku, kita dapat menggabungkannya menggunakan Comparator s.
4. Gambaran Keseluruhan Prestasi
4.1. Masa
Dalam contoh yang kita lihat sebelumnya, memilih elemen terkecil memerlukan sejumlah (n-1) perbandingan diikuti dengan menukarnya ke kedudukan pertama. Begitu juga, memilih elemen terkecil berikutnya yang diperlukan perbandingan total (n-2) diikuti dengan pertukaran pada kedudukan ke-2, dan seterusnya.
Oleh itu, bermula dari indeks 0, kita melakukan n-1, n-2, n-3, n-4…. 1 perbandingan. Elemen terakhir secara automatik berlaku kerana lelaran dan pertukaran sebelumnya.
Secara matematik, jumlah nombor semula jadi n-1 akan memberitahu kita berapa banyak perbandingan yang kita perlukan untuk menyusun susunan ukuran n menggunakan Urutan Pemilihan.
Rumus untuk jumlah n nombor semula jadi adalah n (n + 1) / 2 .
Dalam kes kami, kami memerlukan jumlah nombor semula jadi n-1 . Oleh itu, kami menggantikan n dengan n-1 dalam formula di atas untuk mendapatkan:
(n-1) (n-1 + 1) / 2 = (n-1) n / 2 = (n ^ 2-n) / 2
Oleh kerana n ^ 2 berkembang dengan ketara semasa n tumbuh, kami menganggap kekuatan n yang lebih tinggi sebagai penanda aras prestasi, menjadikan algoritma ini mempunyai kerumitan masa O (n ^ 2).
4.2. Ruang
Dari segi kerumitan ruang tambahan, Urutan Pemilihan memerlukan satu pemboleh ubah tambahan untuk menahan nilai sementara untuk pertukaran. Oleh itu, kerumitan ruang Selection Sort adalah O (1) .
5. Kesimpulan
Selection Sort adalah algoritma penyortiran yang sangat mudah untuk difahami dan dilaksanakan. Sayangnya, kerumitan waktu kuadratik menjadikannya teknik menyusun yang mahal . Juga, kerana algoritma harus mengimbas setiap elemen, kes terbaik, kes rata-rata, dan kerumitan masa terburuk adalah sama .
Teknik penyortiran lain seperti Penyisipan Penyisipan dan Penyortiran Shell juga mempunyai kerumitan waktu terburuk kuadratik, tetapi ia berprestasi lebih baik dalam kes terbaik dan rata-rata.
Lihat kod lengkap untuk Urutan Pemilihan di GitHub.