1. Pengenalan
Dalam artikel ini, kami akan menyelami algoritma urutan baldi. Kami akan memulakan dengan sedikit teori, sebelum mengerjakan pelaksanaan Java bersama dengan unit yang menguji penyelesaian kami. Akhirnya, kita akan melihat kerumitan masa menyusun baldi.
2. Teori Penyusun Baldi
Penyortiran baldi, kadang-kadang dikenali sebagai penyortiran tong, adalah algoritma penyortiran khusus. Urutan berfungsi dengan mengedarkan unsur-unsur yang ingin kita urutkan ke dalam beberapa baldi yang disusun secara individu. Dengan melakukan ini, kita dapat mengurangkan jumlah perbandingan antara unsur-unsur dan membantu mengurangkan masa menyusun.
Mari kita lihat dengan cepat langkah - langkah yang diperlukan untuk melakukan semacam baldi :
- Sediakan sebilangan baldi kosong pada mulanya
- Sebarkan elemen kami ke dalam baldi yang sesuai
- Susun setiap baldi
- Gabungkan baldi yang disusun bersama untuk mencipta semula senarai penuh
3. Pelaksanaan Java
Walaupun algoritma ini tidak khusus bahasa, kami akan menerapkan jenisnya di Java. Mari teliti senarai di atas langkah demi langkah dan tulis kodnya untuk menyusun senarai bilangan bulat.
3.1. Penyediaan Baldi
Pertama, kita perlu menentukan algoritma hash untuk menentukan elemen mana yang dimasukkan ke dalam baldi mana:
private int hash(int i, int max, int numberOfBuckets) { return (int) ((double) i / max * (numberOfBuckets - 1)); }
Dengan kaedah hash kami yang ditentukan, kita sekarang dapat menentukan jumlah tong sampah sebagai punca kuasa dua dari ukuran senarai input :
final int numberOfBuckets = (int) Math.sqrt(initialList.size()); List
buckets = new ArrayList(numberOfBuckets); for(int i = 0; i < numberOfBuckets; i++) { buckets.add(new ArrayList()); }
Akhirnya, kami memerlukan kaedah pendek untuk menentukan bilangan bulat maksimum dalam senarai input kami:
private int findMax(List input) { int m = Integer.MIN_VALUE; for (int i : input) { m = Math.max(i, m); } return m; }
3.2. Mengedarkan Unsur
Setelah menentukan keranjang kami, kami dapat mengedarkan setiap elemen senarai input kami ke dalam baldi yang relevan menggunakan kaedah hash :
int max = findMax(initialList); for (int i : initialList) { buckets.get(hash(i, max, numberOfBuckets)).add(i); }
3.3. Menyusun Baldi Individu
Dengan baldi kami yang ditentukan dan penuh dengan bilangan bulat, mari gunakan Perbandingan untuk menyusunnya :
Comparator comparator = Comparator.naturalOrder(); for(List bucket : buckets){ bucket.sort(comparator); }
3.4. Memadankan Baldi Kami
Akhirnya, kita perlu mengumpulkan baldi kita untuk mencipta senarai tunggal. Oleh kerana baldi kami disusun, kami hanya perlu melengkung setiap baldi sekali dan menambahkan elemen ke senarai induk:
List sortedArray = new LinkedList(); for(List bucket : buckets) { sortedArray.addAll(bucket); } return sortedArray;
4. Menguji Kod Kami
Setelah pelaksanaan kami selesai, mari tulis ujian unit cepat untuk memastikan ia berfungsi seperti yang diharapkan:
BucketSorter sorter = new IntegerBucketSorter(); List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15); List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602); List sorted = sorter.sort(unsorted); assertEquals(expected, sorted);
5. Kerumitan Masa
Seterusnya, mari kita lihat dengan cepat kerumitan masa dalam melaksanakan jenis baldi.
5.1. Senario Kes Terburuk
Dalam senario terburuk, kami akan menemui semua elemen kami dalam baldi yang sama dan dalam urutan terbalik. Apabila kes ini berlaku, kami mengurangkan jenis baldi kami kepada jenis mudah di mana setiap elemen dibandingkan dengan setiap elemen lain, menghasilkan kerumitan masa O (n²) .
5.2. Senario Kes Purata
Dalam kes rata-rata kami, kami mendapati bahawa elemen - elemen tersebut diagihkan secara relatif di antara baldi input kami. Oleh kerana setiap langkah kami memerlukan hanya satu lelaran melalui baldi input kami, kami dapati bahawa jenis baldi kami selesai dalam masa O (n) .
6. Kesimpulannya
Dalam artikel ini, kami melihat bagaimana menerapkan semacam keranjang di Java. Kami juga melihat kerumitan masa algoritma jenis baldi.
Seperti biasa, kod yang ditunjukkan dalam artikel ini terdapat di GitHub.