Panduan untuk Algoritma Penyortiran Di Tempat Berfungsi dengan Pelaksanaan Java

1. Pengenalan

Dalam tutorial ini, kami akan menerangkan bagaimana algoritma penyortiran di tempat berfungsi.

2. Algoritma Di Tempat

Algoritma di tempat adalah algoritma yang tidak memerlukan struktur data tambahan untuk mengubah data input. Pada asasnya, ini bermaksud bahawa algoritma tidak menggunakan ruang tambahan untuk manipulasi input. Ini secara praktikal mengatasi input dengan output.

Namun, pada hakikatnya, algoritma sebenarnya mungkin memerlukan ruang tambahan yang kecil dan tidak tetap untuk pemboleh ubah tambahan. Kerumitan ruang ini dalam kebanyakan kes O (log n) , walaupun kadang-kadang perkara yang kurang daripada linear dibenarkan.

3. Pseudokod

Sekarang mari kita lihat beberapa pseudocode dan bandingkan algoritma di tempat dengan yang di luar tempat.

Kami akan menganggap bahawa kami ingin membalikkan sebilangan nombor n .

3.1. Algoritma Di Tempat

Sekiranya kita memikirkan masalahnya, kita akan melihat bahawa kita mempunyai array input dan array terbalik sebagai output. Pada akhirnya, kita sebenarnya tidak memerlukan susunan asal kita, hanya yang terbalik.

Lalu, mengapa kita tidak menimpa input daripada memindahkan nilainya ke array yang sama sekali baru, kerana ia mungkin kelihatan seperti kaedah yang paling jelas? Untuk melakukannya, kami hanya memerlukan satu pemboleh ubah tambahan untuk menyimpan sementara nilai yang sedang kami bekerjasama:

reversInPlace(array A[n]) for i from 0 to n/2 temp = A[i] A[i] = A[n - 1 - i] A[n - 1 - i] = temp

Perlu diperhatikan bahawa tidak kira seberapa besar susunannya, ruang tambahan yang kita perlukan akan selalu menjadi O (1) dalam hal ini.

Ilustrasi menunjukkan bahawa kita memerlukan lebih sedikit langkah daripada kes sebelumnya:

3.2. Algoritma Di Luar Tempat

Sebaliknya, kita juga boleh melakukan ini dengan cara yang lebih mudah dan lebih jelas. Kita boleh membuat susunan baru dengan ukuran yang sama, menyalin nilai dari yang asal mengikut urutan yang sesuai dan kemudian menghapus susunan asal:

reverseOutOfPlace(array A[n]) create new array B[n] for i from 0 to n - 1 B[i] = A[i] delete A return B

Walaupun ini akan melakukan apa yang kita mahukan, ia tidak cukup cekap. Kami memerlukan ruang tambahan O (n) kerana kami mempunyai dua tatasusunan untuk dimanipulasi . Selain itu, membuat dan membuang array baru biasanya merupakan operasi yang perlahan.

Mari lihat gambaran prosesnya:

4. Pelaksanaan Java

Sekarang mari kita lihat bagaimana kita dapat menerapkan di Jawa apa yang telah kita pelajari di bahagian sebelumnya.

Pertama, kami akan melaksanakan algoritma di tempat:

public static int[] reverseInPlace(int A[]) { int n = A.length; for (int i = 0; i < n / 2; i++) { int temp = A[i]; A[i] = A[n - 1 - i]; A[n - 1 - i] = temp; } return A; }

Kami dapat menguji dengan mudah bahawa ini berfungsi seperti yang diharapkan:

@Test public void givenArray_whenInPlaceSort_thenReversed() { int[] input = {1, 2, 3, 4, 5, 6, 7}; int[] expected = {7, 6, 5, 4, 3, 2, 1}; assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseInPlace(input)); }

Kedua, mari kita lihat pelaksanaan algoritma di luar tempat:

public static int[] reverseOutOfPlace(int A[]) { int n = A.length; int[] B = new int[n]; for (int i = 0; i < n; i++) { B[n - i - 1] = A[i]; } return B; }

Ujiannya cukup mudah:

@Test public void givenArray_whenOutOfPlaceSort_thenReversed() { int[] input = {1, 2, 3, 4, 5, 6, 7}; int[] expected = {7, 6, 5, 4, 3, 2, 1}; assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseOutOfPlace(input)); }

5. Contohnya

Terdapat banyak algoritma penyortiran yang menggunakan pendekatan di tempat. Sebilangannya adalah jenis penyisipan, semacam gelembung, semacam timbunan, quicksort, dan semacam shell dan anda dapat mengetahui lebih lanjut mengenainya dan melihat pelaksanaan Java mereka.

Juga, kita perlu menyebutkan jenis sisir dan heaport. Semua ini mempunyai kerumitan ruang O (log n) .

Ia juga berguna untuk mempelajari lebih lanjut mengenai Teori Notasi Big-O, dan juga memeriksa beberapa Contoh Java Praktikal mengenai kerumitan algoritma.

6. Kesimpulannya

Dalam artikel ini, kami menerangkan apa yang disebut algoritma di tempat, menggambarkan bagaimana ia berfungsi menggunakan pseudocode dan beberapa contoh, menyenaraikan beberapa algoritma yang sesuai dengan prinsip ini, dan akhirnya menerapkan contoh dasar di Java.

Seperti biasa, keseluruhan kod boleh didapati di GitHub.