
Jumlah yang kurang lebih berbeda satu sama lain dijamin lebih dari seratus. Di antara mereka ada subkelompok algoritma yang minimal berbeda satu sama lain, bertepatan dalam beberapa gagasan utama umum. Faktanya, pada tahun-tahun yang berbeda, orang yang berbeda muncul dengan penyortiran yang sama lagi, berbeda dalam rincian yang tidak terlalu mendasar.
Gagasan algoritmik seperti itu lebih sering ditemukan daripada yang lain.
Setiap elemen dimasukkan
kira-kira di tempat array di mana ia seharusnya berada. Ternyata array yang
hampir dipesan . Di mana penyortiran berdasarkan sisipan diterapkan (paling efektif untuk memproses array yang hampir dipesan) atau area unordered lokal diproses secara rekursif oleh algoritma yang sama.

Artikel ini ditulis dengan dukungan EDISON, yang mengembangkan berbagai solusi untuk berbagai tugas: dari program online mencoba pakaian toko multi-merek hingga sistem transmisi LED antara kapal sungai dan laut .
Kami menyukai teori algoritma! ;-)
Untuk mengevaluasi kira-kira di mana Anda ingin meletakkan elemen, Anda perlu mencari tahu berapa banyak berbeda dari elemen rata-rata array. Untuk melakukan ini, Anda perlu mengetahui nilai-nilai elemen minimum dan maksimum, baik, dan ukuran array.
Array yang diurutkan seharusnya memiliki data yang benar-benar acak. Semua penemu metode ini memiliki rumus yang sama:
k adalah tempat perkiraan dalam array tempat elemen
A (
i ) seharusnya berada
min ,
maks - nilai elemen minimum dan maksimum dalam array
AUkuran - jumlah elemen dalam array
AIni ide yang umum. Mari kita lihat variasi mana dari algoritma ini yang dilahirkan berulang kali.
Sorting King Solomon :: Sort Solomon
Metode ini (dan namanya yang indah)
diusulkan oleh pengguna
V2008n sekitar 5 tahun yang lalu. Ada waktu untuk segalanya, “ada waktu untuk menaburkan batu dan ada waktu untuk mengumpulkan batu” (kata-kata Raja Salomo dari buku Pengkhotbah) - dan dalam algoritme, inilah yang terjadi. Pertama, dengan bantuan rumus, kami menyebarkan elemen di tempat yang diinginkan dalam array. Karena formula tidak memberikan tempat yang tepat, tetapi perkiraan, beberapa elemen yang dekat satu sama lain dalam nilai mengklaim beberapa posisi sekaligus. Grup elemen lokal ini diurutkan berdasarkan sisipan dan kemudian disusun dalam urutan akhir.
Urutan interpolasi
"Tidak ada yang baru di bawah matahari," mengutip penulis yang sama lagi. Wikipedia menjelaskan penyortiran dengan interpolasi, yang secara mencurigakan mengingatkan pada penyortiran Solomon. Setiap “tumpukan batu” adalah susunan dinamis kecil tambahan, tempat elemen-elemen yang sama pentingnya berada. Perbedaan utama adalah bahwa setelah “penghamburan batu” kelompok-kelompok elemen lokal yang tidak disortir ini diurutkan bukan oleh sisipan, tetapi dengan menyortir diri mereka dengan interpolasi (secara rekursif atau dalam satu lingkaran).
Array yang dipesan adalah kumpulan data diskrit yang dapat dianggap sebagai himpunan terbatas dari nilai yang diketahui dari fungsi tertentu yang tidak diketahui. Sebenarnya, perkiraan distribusi dari sudut pandang matematika komputasi - ini adalah interpolasi.
Urutan Interpolasi JavaScript - LoopbackArray.prototype.interpolationSort = function() { var divideSize = new Array(); var end = this.length; divideSize[0] = end; while(divideSize.length > 0) {divide(this);} function divide(A) { var size = divideSize.pop(); var start = end - size; var min = A[start]; var max = A[start]; var temp = 0; for(var i = start + 1; i < end; i++) { if(A[i] < min) { min = A[i]; } else { if(A[i] > max) {max = A[i];} } } if(min == max) { end = end - size; } else { var p = 0; var bucket = new Array(size); for(var i = 0; i < size; i++) {bucket[i] = new Array();} for(var i = start; i < end; i++) { p = Math.floor(((A[i] - min) / (max - min)) * (size - 1)); bucket[p].push(A[i]); } for(var i = 0; i < size; i++) { if(bucket[i].length > 0) { for(var j = 0; j < bucket[i].length; j++) {A[start++] = bucket[i][j];} divideSize.push(bucket[i].length); } } } } };
Urutan interpolasi JavaScript - versi rekursif Array.prototype.bucketSort = function() { var start = 0; var size = this.length; var min = this[0]; var max = this[0]; for(var i = 1; i < size; i++) { if (this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } } if(min != max) { var bucket = new Array(size); for(var i = 0; i < size; i++) {bucket[i] = new Array();} var interpolation = 0; for(var i = 0; i < size; i++){ interpolation = Math.floor(((this[i] - min) / (max - min)) * (size - 1)); bucket[interpolation].push(this[i]); } for(var i = 0; i < size; i++) { if(bucket[i].length > 1) {bucket[i].bucketSort();}
Sortir histogram :: Sortir histogram
Ini adalah optimasi penyortiran berdasarkan interpolasi, yang menghitung jumlah elemen yang dimiliki grup lokal yang tidak disortir. Hitungan ini memungkinkan Anda untuk memasukkan item yang tidak disortir langsung ke dalam array yang dihasilkan (alih-alih mengelompokkannya ke dalam array kecil yang terpisah).
Sortir Bilah JavaScript Array.prototype.histogramSort = function() { var end = this.length; var sortedArray = new Array(end); var interpolation = new Array(end); var hitCount = new Array(end); var divideSize = new Array(); divideSize[0] = end; while(divideSize.length > 0) {distribute(this);} function distribute(A) { var size = divideSize.pop(); var start = end - size; var min = A[start]; var max = A[start]; for(var i = start + 1; i < end; i++) { if (A[i] < min) { min = A[i]; } else { if (A[i] > max) {max = A[i];} } } if (min == max) { end = end - size; } else { for(var i = start; i < end; i++){hitCount[i] = 0;} for(var i = start; i < end; i++) { interpolation[i] = start + Math.floor(((A[i] - min) / (max - min)) * (size - 1)); hitCount[interpolation[i]]++; } for(var i = start; i < end; i++) { if(hitCount[i] > 0){divideSize.push(hitCount[i]);} } hitCount[end - 1] = end - hitCount[end - 1]; for(var i = end - 1; i > start; i--) { hitCount[i - 1] = hitCount[i] - hitCount[i - 1]; } for(var i = start; i < end; i++) { sortedArray[hitCount[interpolation[i]]] = A[i]; hitCount[interpolation[i]]++; } for(var i = start; i < end; i++) {A[i] = sortedArray[i];} } } };
Urutan tag interpolasi
Untuk lebih mengoptimalkan overhead, disarankan di sini untuk mengingat bukan jumlah elemen yang sama dalam kelompok yang tidak disortir, tetapi cukup menandai awal dari grup ini dengan bendera Benar / Salah. Benar berarti bahwa subkelompok sudah diurutkan, dan Salah berarti belum.
Jenis interpolasi tagged JavaScript Array.prototype.InterpolaionTagSort = function() { var end = this.length; if(end > 1) { var start = 0 ; var Tag = new Array(end);
Urutan tag interpolasi (di tempat)
Jika nilai-nilai elemen dalam array tidak diulang dan didistribusikan secara merata (secara kasar - jika data dalam bentuk yang diurutkan adalah seperti perkembangan aritmatika), maka Anda dapat mengurutkan dalam satu lintasan, menyortir tepat di tempatnya, tanpa memindahkan elemen ke array perantara.
Urutkan berdasarkan interpolasi dengan label (di tempat) dalam JavaScript Array.prototype.InPlaceTagSort = function() { var n = this.length; var Tag = new Array(n); for(i = 0; i < n; i++) {Tag[i] = false;} var min = this[0]; var max = this[0]; for(i = 1; i < n; i++) { if(this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } } var p = 0; var temp = 0; for(i = 0; i < n; i++) { while(Tag[i] == false) { p = Math.floor(((this[i] - min) / (max - min)) * (n - 1)); temp = this[i]; this[i] = this[p]; this[p] = temp; Tag[p] = true; } } };
Sortir Flash :: Flashsort
Suatu ketika, saya
menulis tentang penyortiran, yang ditemukan oleh profesor biofisika Neubert pada tahun 1998.
Profesor menyarankan untuk mendistribusikan elemen ke dalam beberapa kelas terpisah (keanggotaan kelas ditentukan oleh ukuran elemen). Dengan mengingat hal ini, rumusnya terlihat seperti ini:
Alih-alih Ukuran (ukuran array), rumus menunjukkan
m - jumlah kelas dimana kita mendistribusikan elemen-elemen array. Rumus tidak menghitung kunci dalam array tempat elemen harus dilemparkan, tetapi nomor kelas tempat elemen tersebut berada.
Penyortiran ini tidak buruk karena lebih hemat soal memori tambahan. Redistribusi elemen terjadi pada tempatnya. Hanya lokalisasi kelas yang disimpan secara terpisah (well, jika Anda melihat dari sudut yang berbeda, jumlah elemen milik kelas tertentu disimpan secara terpisah).
Nah, sisanya adalah lagu yang sama.
Sortir Flash di Jawa class FlashSort { static int n; static int m; static int[] a; static int[] l; public static void flashSort(int size) { n = size; generateRandomArray(); long start = System.currentTimeMillis(); partialFlashSort(); long mid = System.currentTimeMillis(); insertionSort(); long end = System.currentTimeMillis();
Approximate Sort :: Proxmap sort
Penyortiran ini adalah yang tertua dari yang disebutkan di sini, diperkenalkan pada tahun 1980 oleh Profesor Thomas Standish dari University of California. Secara penampilan, tampaknya sangat berbeda, tetapi jika Anda perhatikan lebih dekat, semuanya sama.
Algoritma beroperasi dengan konsep seperti
hit - angka tertentu yang dekat nilainya dengan beberapa elemen array.
Untuk menentukan apakah elemen array adalah hit,
fungsi aproksimasi diterapkan ke elemen.
Profesor Standish mengurutkan susunan bilangan real. Fungsi aproksimasi adalah untuk membulatkan bilangan real ke bilangan bulat.
Misalnya, jika array berisi elemen 2.8, 2, 2.1, 2.6, dll. maka hit untuk angka-angka ini akan menjadi deuce.
Prosedur umum:
- Kami menerapkan fungsi perkiraan untuk setiap elemen, menentukan klik mana yang sesuai dengan elemen berikutnya.
- Jadi, untuk setiap klik, kita dapat menghitung jumlah elemen yang sesuai dengan klik ini.
- Mengetahui jumlah elemen untuk semua hit, kami menentukan lokalisasi hit (berbatasan di sebelah kiri) dalam array.
- Mengetahui pelokalan hit, kami menentukan lokalisasi setiap elemen.
- Setelah menentukan lokalisasi elemen, kami mencoba memasukkannya di tempatnya dalam array. Jika tempat sudah diambil, maka kami memindahkan tetangga ke kanan (jika elemen lebih kecil dari mereka) untuk memberikan ruang bagi elemen. Atau ke kanan kita memasukkan elemen itu sendiri (jika lebih dari tetangga).
Sebagai fungsi perkiraan, Anda dapat menetapkan satu berdasarkan sifat umum dari data dalam array. Dalam implementasi modern penyortiran ini, hit biasanya ditentukan bukan dengan menggigit bagian pecahan, tetapi menggunakan formula favorit kami.
Jenis perkiraan JavaScript Array.prototype.ProxmapSort = function() { var start = 0; var end = this.length; var A2 = new Array(end); var MapKey = new Array(end); var hitCount = new Array(end); for(var i = start; i < end; i++) {hitCount[i] = 0;} var min = this[start]; var max = this[start]; for (var i = start+1; i < end; i++){ if (this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } }
Penyortiran sisipan hash jenis: Menyortir hash
Baiklah, kami akan mengakhiri ulasan kami dengan algoritme
yang disarankan oleh bobbyKdas
habraiser 6 tahun yang lalu. Ini adalah algoritma hybrid di mana, selain distribusi dan memasukkan, penggabungan juga ditambahkan.
- Array dibagi secara setengah menjadi setengahnya, sampai pada suatu langkah ukuran setengah-setengah mencapai ukuran minimum (penulis tidak memiliki lebih dari 500 elemen).
- Pada tingkat rekursi terendah, algoritme yang akrab diterapkan pada masing-masing setengah subarray - menggunakan rumus yang sama, distribusi perkiraan terjadi di dalam subarray, dengan pengurutan berdasarkan sisipan bagian yang tidak disortir lokal.
- Setelah pengaturan dua bagian dari subarrays, mereka bergabung.
- Poin 3 (penggabungan setengah bagian yang diurutkan) diulangi saat naik melalui tingkat rekursi ke bagian paling atas, ketika array asli digabungkan dari dua bagian.
Urutkan dengan memasukkan hash di Jawa import java.util.Arrays; import java.util.Date; import java.util.Random; public class HashSort {
Rumus itu sendiri disebut fungsi hash, dan array bantu untuk perkiraan distribusi disebut tabel hash.
Referensi
Interpolasi & Histogram ,
Flash ,
Proxmap
Solomon ,
Hash Table ,
FlashArtikel Seri:
Penyortiran perkiraan muncul dalam aplikasi AlgoLab Excel (dalam hal ini, dalam array awal yang tidak disortir, bagian pecahan acak ditambahkan ke bilangan bulat). Solomon dan Flash telah ada di sana untuk waktu yang lama, tetapi belum menerapkan interpolasi, hash, dan histogram.