
Artikel ini membahas berbagai opsi untuk menyortir pertukaran, dan juga menjelaskan aplikasi grafis sederhana (
processing.js ) dengan contoh-contoh macam.
Sebelum membaca, saya sarankan Anda membaca artikel oleh pengguna
valemak :
→
Penyortiran pertukaran→
Bubble Sort dan All-All-All→
Semacam konyol dan beberapa lainnya lebih pintarSortir Bubble
Opsi paling sederhana adalah beralih dari array dari elemen pertama ke elemen tetangga yang bertukar (jika perlu).
→ Periksa
di siniUntuk memindahkan slider, Anda perlu mengklik tombol abu-abu di sudut kiri bawah.
Ketika Anda mengklik tombol, gerakkan slider satu langkah ke kanan
slider++;
Selanjutnya, kita periksa: sudahkah kita mencapai akhir array (lalu lompat ke awal), lalu membandingkan (menukar) elemen-elemen tetangga
Processing.js menggunakan struktur data Java, kemudian kode tersebut diterjemahkan ke dalam javascript (
tautan ), sehingga deklarasi array instance dari kelas Module, yang bertanggung jawab untuk merender elemen dan menginisialisasi instance, terjadi seperti ini
Kode Module[] mods; ... mods[0] = new Module(1*30, 30); mods[1] = new Module(2*30, 50); mods[2] = new Module(3*30, 10); mods[3] = new Module(4*30, 60); mods[4] = new Module(5*30, 20); mods[5] = new Module(6*30, 100); mods[6] = new Module(7*30, 80); mods[7] = new Module(8*30, 70); mods[8] = new Module(9*30, 90); mods[9] = new Module(10*30, 40);
Fungsi utama menggambar
void draw () adalah loop tak terbatas di mana instance kelas diurutkan
for (Module mod : mods) { mod.display(); }
Tambahkan fungsi
randFoo () , yang mengembalikan nilai acak. Untuk memastikan bahwa nilai-nilai tidak diulang, kami akan menambahkannya ke
ArrayLis t dalam daftar
listRand , dan dalam fungsi
randFoo () , periksa apakah nomor acak baru ada di daftar
listRand int randFoo(){ newRand = int(random(1,11)); if(!listRand.contains(newRand) ) listRand.add(newRand ); else newRand=randFoo(); return newRand; }
→ Periksa
di siniSortir Pixel
Pixel sorting (di sini) adalah implementasi dari bubble sorting.
Kami akan menggeser piksel yang lebih hangat / lebih terang ke satu sisi, dan yang lebih gelap / lebih dingin ke yang lain
void draw(){ while (i <= height) { c=get(i,j);
→ Periksa
di siniUntuk mulai menyortir, klik pada gambar dan tahan tombol.
Anda dapat membaca lebih lanjut tentang jenis pixel di
sini .
Video tentang penyortiran piksel pada saluran resmi The Coding Train
di siniPembatas dan bendera

Anda dapat mengurangi jumlah iterasi jika Anda tidak mengulangi item yang sudah diurutkan. Untuk melakukan ini, tambahkan
limiter ke ujung array, yang akan bergeser ke awal array setelah setiap iterasi
if(slider>=limiter) { slider=1; limiter--; if(limiter<1) limiter=1; }
→ Periksa
di siniCara lain untuk mengurangi jumlah payudara dapat ditemukan di artikel
Bubble Sort (Wikipedia). Jika selama bagian dari array kita tidak pernah mengganti elemen tetangga, array diurutkan dan siklus dapat diselesaikan (kondisi
Iverson ).
Tambahkan bendera
bendera , yang dimunculkan ketika kita bertemu beberapa elemen yang perlu dipertukarkan. Jika bendera dinaikkan, beralih lagi ke array. Jika tidak, akhiri siklus. Keadaan bendera ditampilkan di konsol.
Periksa elemen tetangga if(mods[slider].rectHight < mods[slider-1].rectHight) { flag=true;
→ Periksa
di siniJika Anda meletakkan pembatas di sebelah kiri dan menggunakan elemen dengan pembatas sebagai referensi / minimum, kami mendapatkan pengurutan berdasarkan pilihan.

Tambahkan variabel
min di mana nilai minimum akan dimuat. Misalkan pada awalnya elemen paling kiri minimal: selama pass pertama array, jika sebuah elemen kurang dari minimum, maka kita menyimpan elemen ini sendiri dalam variabel
min if(mods[slider-1].rectHight < min){ min=mods[slider-1].rectHight; }
lalu tukar elemen pertama dan minimum
if (mods[limiterL-1].rectHight>min) { vTemp= mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=mods[slider-1].rectHight; mods[slider-1].rectHight=vTemp; }
Jika slider mencapai tepi kanan array, maka limiter bergerak satu langkah ke kanan, dan slider bergerak ke limiter
if(slider==moduleSize){ if(limiterL<moduleSize) limiterL++; min=mods[limiterL-1].rectHight; incPaddle=limiterL-1; }
→ Periksa
di siniJumlah tindakan dapat dikurangi jika pada awal pencarian kami membandingkan (menukar) elemen saat ini dan elemen paling kanan dari array
if(mods[limiterL-1].rectHight>mods[moduleSize-1].rectHight) { vTemp=mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=mods[moduleSize-1].rectHight; mods[moduleSize-1].rectHight=vTemp; }
Maka Anda tidak dapat memeriksa elemen paling kanan dari array
→ Periksa
di siniDi sini Anda dapat menambahkan pengurutan bagian kanan array dalam urutan menurun dengan menambahkan elemen maksimum
maks - kami mendapatkan pengocok berdasarkan pilihan. Lihat bagian menyortir shaker di akhir artikel.
Sortir cepat

Mekanisme pemilihan elemen pendukung juga digunakan dalam penyortiran cepat. Algoritma ini melibatkan pemilihan elemen referensi awal dengan mana semua elemen array dibandingkan. Waktu eksekusi algoritma tergantung pada pilihan elemen awal. Dalam gif di atas, elemen awal adalah nomor
3 . Anda dapat membaca lebih lanjut tentang memilih elemen dukungan awal di
artikel (Wikipedia).
Video tentang penyortiran cepat tersedia di saluran youtube resmi dari bahasa
pemrosesan dan
p5.js. Di sini Anda dapat melihat visualisasi algoritma.
Jika elemen pertama adalah dasar, maka Anda dapat memasukkan elemen lebih kecil dari yang dasar di depannya, maka array akan dibagi menjadi dua bagian, elemen di sebelah kiri akan lebih kecil dari dasar, di sebelah kanan - lebih. Untuk metode semacam itu, lihat bagian menyortir berdasarkan sisipan di bawah ini.
Sortir Kurcaci
Pada dasarnya, gnome melihat pot taman berikutnya dan sebelumnya: jika mereka berada dalam urutan yang benar, ia melangkah maju satu pot, jika tidak ia menukar mereka dan mundur satu pot.
Setelah menaikkan flag, simpan koordinat slider di variabel
limiterR dan kembalikan slider ke awal array dalam langkah-langkah
slider--;
Setelah di awal array, reset flag dan letakkan slider di sel dengan koordinat yang kita simpan di variabel
limiterR if(slider==0){ flag=false; slider=limiterR; }
→ Periksa
di siniDengan mengubah algoritma ini, kita mendapatkan "
pengurutan berdasarkan sisipan ."
Dalam mengurutkan berdasarkan sisipan, elemen referensi / minimum dipilih, kemudian di bagian array yang tidak disortir, elemen dipilih, lebih kecil dari referensi dan dimasukkan sebelum referensi

Mari kita memiliki tempat pertukaran elemen minimal dengan yang sebelumnya, hingga yang referensi, dan seterusnya.
dimasukkan di depan referensi.
Tambahkan sebuah kondisi
if(slider==limiterR-1 && mods[slider-1].rectHight<mods[limiterR-1].rectHight){ flag=false; slider=limiterR; }
→ Periksa
di siniPerbandingan dengan limiterOpsi penyortiran ini dapat secara sewenang-wenang disebut "penyortiran kurcaci".
Letakkan pembatas di sebelah kiri dan kita akan menggunakan elemen dengan pembatas sebagai referensi / minimum, seperti dalam pemilihan pengurutan.
Jika elemen saat ini lebih besar dari minimum, gerakkan slider ke kanan
if(mods[slider-1].rectHight > mods[limiterL-1].rectHight) slider++;
Jika elemen saat ini kurang dari minimum, simpan koordinat slider di variabel
limiterR dan kembalikan slider ke awal array dalam langkah-langkah, seperti pada jenis gnome
vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[slider-2].rectHight; mods[slider-2].rectHight=vTemp; slider--;
Setelah di awal array, reset flag dan letakkan slider di sel dengan koordinat yang kita simpan di variabel
limiterR if(flag && slider==limiterL) { flag=false; slider=limiterR; }
Jika slider melampaui tepi kanan, pindahkan pembatas satu langkah ke kanan, kembalikan slider ke pembatas
if(slider==moduleSize+1) { limiterL++; slider=limiterL+1; }
→ Periksa
di siniDi sini Anda dapat menambahkan perbandingan (pertukaran) elemen saat ini dan yang berikut dengan metode gelembung
if(slider<moduleSize)if(mods[slider].rectHight<mods[slider-1].rectHight){ vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[slider].rectHight; mods[slider].rectHight=vTemp; }
→ Periksa
di sini Penyortiran penyisipan "Cepat"Dalam algoritma ini, array dibagi menjadi dua bagian oleh elemen pendukung.
Biarkan elemen pertama menjadi referensi: bandingkan, mulai dari yang kedua, elemen array dengan referensi, jika elemen lebih kecil dari referensi
if(mods[slider-1].rectHight < mods[pivot-1].rectHight)
masukkan elemen yang ditemukan sebelum referensi
if(mods[slider-1].rectHight < mods[pivot-1].rectHight){ flag=true;
Jika bendera dinaikkan, gerakkan penggeser ke kiri dalam beberapa langkah hingga kami memenuhi elemen dukungan
if(flag){ slider--; if(slider<pivot){ flag=false;
T.O. array dibagi menjadi dua bagian, di sebelah kiri - elemen lebih kecil dari referensi, di sebelah kanan - lebih
→ Periksa
di siniJika, setelah setiap enumerasi, koordinat elemen pendukung disimpan dalam ext.
pivotsArr array, maka ketika elemen referensi mencapai tepi kanan, kita mendapatkan array yang diurutkan berdasarkan level / langkah. Elemen di setiap level selanjutnya akan lebih besar dari elemen di level sebelumnya. Batas-batas level akan dimuat dalam add. array
pivotsArrSetiap kali Anda mengklik tombol, kami akan menampilkan array
pivotsArr ke konsol
for(int i=0;i<pivotsArr.length;i++){ print(" "); print(pivotsArr[i]); print(" "); }
Tambahkan fungsi acak
randFoo () ke akhir program.
→ Periksa
di siniSekarang Anda perlu mengurutkan elemen-elemen dari setiap level secara terpisah (hanya tinggal menambahkan kondisi untuk mengakhiri siklus)
→ Periksa
di siniPenyortiran ini dapat digambarkan sebagai
penyortiran berdasarkan level.
, karena setelah setiap enumerasi, data numerik disusun dalam level, jumlah setiap level berikutnya melebihi angka pada yang sebelumnya.
Penyortiran ganjil
Kami akan memindahkan slider dengan dua langkah, membandingkan elemen-elemen tetangga
slider=slider+2;
T.O. kita membandingkan elemen 0 dan 1, 2 dan 3, 4 dan 5, 6 dan 7, dll.
Jika slider mencapai tepi array, maka biarkan limiter bergerak satu langkah ke kiri, dan slider bergerak ke awal array.
Selanjutnya, kita membandingkan elemen 1 dan 2, 3 dan 4, 5 dan 6, 7 dan 8, dll.
Setelah mencapai pembatas, kami menggesernya satu langkah ke kanan, meletakkan slider di awal array.
→ Periksa
di siniUrutkan sikat rambut
Biarkan slider berada di awal array dan pembatas kanan di akhir. Bandingkan elemen (tukar). Kami memindahkan limiter satu langkah ke kiri dan menyimpan indeksnya dalam
variabel limiterStore if(limiter==moduleSize) { limiter = limiterStore-1; limiterStore = limiter; slider=1; }
Pindahkan slider dengan berhenti ke ujung array dalam langkah-langkah
if(limiter!=moduleSize) {
Setelah mencapai ujung array sebagai limiter, letakkan slider di awal array, dan masukkan limiter di
limiterStore-1 if(limiter==moduleSize) { limiter = limiterStore-1; limiterStore = limiter; slider=1; }
→ Periksa
di siniSemacam pengocok

Tambahkan limiter kiri
limiterL ke awal array.
Biarkan bendera
bendera naik ketika slider mencapai limiter kanan
limiterR , lalu limiter bergerak satu langkah ke kiri. Selanjutnya, ketika bendera dinaikkan, slider bergerak mundur ke limiter kiri
limiterL - limiter bergerak satu langkah ke kanan - slider bergerak bertahap ke kanan
→ Periksa
di siniShaker disortir berdasarkan pilihanTambahkan ke semacam gelembung dengan pembatas kanan pembatas kiri. Pada setiap pergeseran slider ke kanan, kami memeriksa (swap), yang lebih besar - elemen saat ini atau pembatas
if(mods[slider-1].rectHight<mods[limiterL-1].rectHight){ vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=vTemp; }
Ketika slider mencapai limiter
limiterR kanan, limiter kanan bergerak satu langkah ke kiri, limiter kiri bergerak satu langkah ke kanan, slider kembali ke limiter kiri
if(slider>=limiterR){ limiterL++; slider=limiterL; limiterR--; }
→ Periksa
di siniPS Di
sinilah aplikasi dijelaskan yang membuat mempelajari algoritma dan struktur data
jauh lebih menarik .
Visualisasi
lain dari sejumlah algoritma dan struktur data.
Artikel ini menyebutkan
situs lain tempat Anda dapat melihat bagaimana data diurutkan berdasarkan algoritma yang berbeda.
Artikel ini memberikan penilaian tentang kompleksitas penyortiran gelembung.
Lebih lanjut tentang penilaian kompleksitas dapat dibaca di
sini , di
sini , di
sini , di
sini .