Sortir cepat, juga dikenal sebagai pemisahan dan penyortiran pertukaran. Algoritma penyortiran cepat diimplementasikan dengan strategi membagi dan menaklukkan.
Artikel ini terutama berbicara tentang menggunakan JavaScript untuk mengimplementasikan pemilahan ide-ide di tempat yang cepat
Membagi dan merawat metode:
Dalam ilmu komputer, metode Divisi dan Penaklukan adalah paradigma algoritma yang sangat penting berdasarkan beberapa rekursi cabang. Penjelasan literal adalah "membagi dan menaklukkan", yang berarti membagi masalah yang kompleks menjadi dua atau lebih sub-masalah yang identik atau serupa sampai akhir sub-masalah dapat dipecahkan secara sederhana dan langsung, dan solusi dari masalah asli adalah penggabungan solusi dari sub-masalah. (Kutipan dari Wikipedia)
Ide penyortiran cepat
Tentukan elemen dalam array sebagai penguasa, tempatkan yang lebih besar dari itu dan letakkan lebih kecil dari itu sebelum elemen, ulangi ini sampai semua diatur dalam urutan positif.
Penyortiran cepat dibagi menjadi tiga langkah:
Pilih Benchmark: Pilih elemen sebagai tolok ukur dalam struktur data (pivot)
Partisi: Lihat ukuran nilai elemen referensi, bagi area yang tidak teratur. Semua data lebih kecil dari elemen referensi ditempatkan dalam satu interval, dan semua data lebih besar dari elemen referensi ditempatkan dalam interval lain. Setelah operasi partisi selesai, posisi elemen referensi adalah posisi di mana seharusnya setelah penyortiran akhir.
Rekursi: Secara rekursif memanggil algoritma pada Langkah 1 dan Langkah 2 untuk pertama kalinya sampai hanya ada satu elemen yang tersisa dalam semua interval yang tidak dipesan.
Sekarang mari kita bicara tentang metode implementasi umum (tidak ada algoritma di tempat yang digunakan)
function quicksort (arr) {if (arr.length <= 1) return; // tolong tolok ukur digit yang paling dekat dengan tengah array, angka ganjil dan bahkan angka mengambil nilai berbeda, tetapi saya tidak berpikir begitu. Tentu saja, Anda dapat memilih angka pertama atau terakhir sebagai tolok ukur, dan tidak ada terlalu banyak deskripsi di sini var pivotIndex = math.floor (arr.length/2); var pivot = arr.splice (pivotindex, 1) [0]; // interval kiri dan kiri digunakan untuk menyimpan angka yang diurutkan var kiri = [] [] [] [0]; // Interval kiri dan kiri digunakan untuk menyimpan angka diurutkan var kiri = [] [] [] [] [') (CONSOLE KIRI, CONSOLE digunakan untuk menyimpan bilangan sortir var kiri = [] [] [] [] [') (CONSOLE KIRI: CONSOLE digunakan untuk menyimpan bilangan sortir var kiri = [] [] [] [] [') (CONSOLE' CONSOLE digunakan untuk menyimpan bilangan sortir var kiri = [] [] [] [] [') (CONSOLE' CONSOLE digunakan untuk menyimpan bilangan sortir var kiri = [] [] [] [] ') foro. ; {right.push (arr [i]); console.log ('kanan:' + (arr [i]))}} // operator concat digunakan di sini untuk menyambungkan interval kiri, referensi, dan interval kanan ke dalam array baru, kemudian recursive 1 dan 2 langkah sampai semua interval yang tidak dipesan. quicksort (kanan));} var arr = [14, 3, 15, 7, 2, 76, 11]; console.log (quicksort (arr));/** Ketika pangkalan adalah 7, partisi pertama diperoleh dengan dua subset di kiri dan kanan. sorting of the left subset ends* With the reference as 76, the right subset is divided and sorted to obtain [14, 15, 11] 76* At this time, the above [14, 15, 11] is divided and sorted to the above [14, 15, 11] is divided and sorted to the above [14, 11] is divided and sorted to the above [14, 11] is divided and sorted to the above [14, 11] is divided and sorted to the above [14, 11] dibagi dan diurutkan ke atas [11] dibagi dan diurutkan ke pangkalan 11, 11 [14]*Hanya ada satu elemen yang tersisa dalam semua interval yang tidak tertib, dan ujung rekursif **/Melalui debugging breakpoint, hasilnya dapat diperoleh.
Kerugian:
Ini membutuhkan ruang penyimpanan ekstra ω (n), yang seburuk penggabungan penyortiran. Dalam lingkungan produksi, diperlukan ruang memori tambahan, mempengaruhi kinerja.
Pada saat yang sama, banyak orang berpikir bahwa di atas adalah jenis yang sangat cepat. Oleh karena itu, di bawah ini, perlu merekomendasikan penyortiran cepat dari algoritma di tempat
Untuk informasi tentang algoritma in-situ, silakan merujuk ke Wikipedia. Para siswa yang berada di bawah tembok mirip dengan Baidu.
di tempat
Penyortiran cepat umumnya diimplementasikan dengan rekursi. Yang paling penting adalah fungsi segmentasi partisi, yang membagi array menjadi dua bagian, satu lebih kecil dari pivot dan yang lainnya lebih besar dari pivot. Prinsip spesifik telah disebutkan di atas
fungsi quicksort (arr) {// swap function swap (arr, a, b) {var temp = arr [a]; arr [a] = arr [b]; arr [b] = temp;} // partisi fungsi partisi (arr, kiri, kanan) {/*** Pada awalnya, Anda tidak tahu lokasi penyimpanan Pivot yang paling tepat di sini, Anda dapat menukar Pivot di sini, Anda dapat menukar Pivot di sini, Anda tidak dapat menukar Pivot di sini, Anda tidak dapat menukar Pivot di sini, Anda tidak dapat menukar Pivot, Anda tidak dapat menukar Pivot, Anda tidak dapat menukar Pivot, Anda tidak dapat menukar Pivot, Anda tidak dapat menukar Pivot, Anda tidak dapat menukar Pivot, Anda dapat menukar Pivot, Anda dapat menukar Pivot ke sini. = arr [kanan];/*** Saat menyimpan elemen yang lebih kecil dari pivot, mereka berada di sebelah elemen sebelumnya, jika tidak elemen yang disimpan dalam celah mungkin lebih besar dari pivot,* Oleh karena itu, variabel Storeindex dinyatakan dan diinisialisasi ke kiri untuk menyimpan elemen yang lebih kecil dari pivot di sebelah satu sama lain. */var StoreIndex = kiri; untuk (var i = kiri; i <kanan; i ++) {if (arr [i] <pivot) {/*** TRURSE array dan temukan elemen yang lebih kecil dari pivot, (elemen yang lebih besar dari pivot akan dilewati)* Letakkan elemen yang diperoleh dengan looping I Times to Storeindex melalui pertukaran swap,* dan inkrement yang diperoleh dengan looping I Times to Storeindex melalui swap Exchange,* dan inci. swapped*/swap(arr, storeIndex, i);storeIndex++;}}// Finally: swap pivot to storeIndex, place the benchmark element at the final correct position swap(arr, right, storeIndex);return storeIndex;}function sort(arr, left, right) {if (left > right) return;var storeIndex = partition(arr, left, right);sort(arr, left, storeIndex - 1); urutkan (arr, storeindex + 1, kanan);} sort (arr, 0, arr.length - 1); return arr;} console.log (quicksort ([8, 4, 90, 8, 34, 67, 1, 26, 17]));Optimasi partisi
Siswa yang hati -hati di sini dapat bertanya apakah akan ada kinerja kinerja yang berbeda saat memilih tolok ukur yang berbeda. Jawabannya adalah ya, tetapi karena saya orang front-end dan tidak tahu banyak tentang algoritma, jadi lubang ini diserahkan kepada orang-orang kuat untuk diisi.
Kompleksitas
Penyortiran cepat adalah algoritma penyortiran tercepat, dan kompleksitas waktunya adalah O (log n)
Dalam situasi rata -rata, urutan item N membutuhkan perbandingan (n log n). Dalam kasus terburuk, diperlukan perbandingan (N2).
https://github.com/lyz0106/
Di atas adalah metode penyortiran cepat dari Ide-Ide Di Tempat Implementasi JavaScript yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda untuk situs web Wulin Network!