Metode Penyortiran Array di Ruby

Menyortir adalah perhatian ilmuwan komputer sejak awal. Ada banyak algoritma yang muncul dan tidak digunakan lagi dan masih hari ini algoritma baru mendorong batasan kinerja. Menjadi bahasa tingkat tinggi, Anda tidak akan menerapkan algoritma penyortiran Rubi jika Anda peduli tentang kinerja, dan selain itu, sortir Array dan koleksi lainnya adalah lebih banyak hal yang Ruby lakukan untuk Anda.

Secara teknis, menyortir adalah pekerjaan yang ditangani oleh modul Enumerable. Modul Enumerable adalah yang mengikat semua jenis koleksi di Ruby bersama-sama. Ini menangani iterasi koleksi, memilah, melihat melalui dan menemukan elemen tertentu, dll. Bagaimana Enumerable mengurutkan koleksi adalah sedikit misteri, atau setidaknya harus tetap begitu. Algoritma pengurutan yang sebenarnya tidak relevan, satu-satunya hal yang perlu Anda ketahui adalah bahwa objek dalam koleksi dibandingkan menggunakan "operator pesawat ruang angkasa."

"Operator pesawat ruang angkasa" mengambil dua objek, membandingkannya dan kemudian mengembalikan -1, 0 atau 1. Itu agak kabur, tetapi operator itu sendiri tidak memiliki perilaku yang didefinisikan dengan sangat baik. Mari kita ambil objek Numeric misalnya. Jika Anda memiliki dua objek numerik

instagram viewer
Sebuah dan b, dan mengevaluasi a <=> b, apa yang akan dievaluasi ekspresi? Dalam kasus Numerik, mudah diketahui. Jika a lebih besar dari b, itu akan menjadi -1, jika mereka sama itu akan menjadi 0 dan jika b lebih besar dari a, itu akan menjadi 1. Ini digunakan untuk memberi tahu algoritma pengurutan yang salah satu dari dua objek harus pergi pertama di Himpunan. Hanya ingat bahwa jika operan kiri adalah yang pertama dalam array, ia harus mengevaluasi ke -1, jika tangan kanan harus yang pertama itu harus 1, dan jika tidak masalah itu harus 0.

Itu tidak selalu mengikuti aturan yang rapi. Apa yang terjadi jika Anda menggunakan operator ini pada dua objek dari tipe yang berbeda? Anda mungkin akan mendapatkan pengecualian. Apa yang terjadi ketika Anda menelepon 1 <=> 'monyet'? Ini akan menjadi setara dengan panggilan 1. <=> ('Monyet'), artinya metode aktual sedang dipanggil pada kiri operan dan Fixnum # <=> mengembalikan nol jika operan kanan bukan numerik. Jika operator mengembalikan nol, metode pengurutan akan memunculkan pengecualian. Jadi, sebelum menyortir array pastikan mereka mengandung objek yang bisa diurutkan.

Kedua, perilaku aktual operator pesawat ruang angkasa tidak ditentukan. Ini hanya ditentukan untuk beberapa kelas dasar, dan untuk kelas khusus Anda, sepenuhnya terserah Anda apa yang Anda inginkan. Jika Anda punya Siswa kelas Anda dapat meminta siswa mengurutkan berdasarkan nama belakang, nama depan, tingkat kelas atau kombinasi dari itu. Jadi selalu sadar bahwa perilaku operator pesawat ruang angkasa dan penyortiran tidak didefinisikan dengan baik untuk apa pun kecuali tipe pangkalan.

Anda memiliki Array objek Numerik dan Anda ingin menyortirnya. Ada dua metode utama untuk melakukan ini: menyortir dan menyortir!. Yang pertama membuat salinan array, mengurutkannya dan mengembalikannya. Yang kedua macam array di tempat.

Cukup jelas. Jadi ayo kita mulai. Bagaimana jika Anda tidak ingin bergantung pada operator pesawat ruang angkasa? Bagaimana jika Anda menginginkan perilaku yang sama sekali berbeda? Kedua metode penyortiran ini mengambil parameter blok opsional. Blok itu membutuhkan dua parameter dan harus menghasilkan nilai seperti yang dilakukan operator pesawat ruang angkasa: -1, 0 dan 1. Jadi, mengingat sebuah array, kami ingin mengurutkannya sehingga semua nilai yang dapat dibagi oleh 3 menjadi yang utama, dan semua yang lain datang setelahnya. Urutan yang sebenarnya tidak masalah di sini, hanya saja mereka yang dapat dibagi 3 menjadi yang pertama.

Bagaimana cara kerjanya? Pertama, perhatikan argumen blokir ke metode sortir. Kedua, perhatikan pembagian modulo yang dilakukan pada parameter blok, dan penggunaan kembali operator pesawat ruang angkasa. Jika satu adalah kelipatan dari 3, modulo akan menjadi 0, jika tidak, itu akan menjadi 1 atau 2. Karena 0 akan mengurutkan sebelum 1 atau 2, hanya modulo yang penting di sini. Menggunakan parameter blok sangat berguna dalam array yang memiliki lebih dari satu jenis elemen, atau ketika Anda ingin mengurutkan pada kelas khusus yang tidak memiliki operator pesawat ruang angkasa yang ditentukan.

Ada satu lagi metode pengurutan, yang disebut Sortir dengan. Namun, Anda harus terlebih dahulu memahami menerjemahkan array dan koleksi dengan peta sebelum menangani sort_by.

instagram story viewer