Susun Baldi di Jawa

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 :

  1. Sediakan sebilangan baldi kosong pada mulanya
  2. Sebarkan elemen kami ke dalam baldi yang sesuai
  3. Susun setiap baldi
  4. 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.