Cara Menggabungkan Dua Susunan Diurut di Java

1. Pengenalan

Dalam tutorial ini, kita akan belajar bagaimana menggabungkan dua tatasusunan yang disusun ke dalam satu susunan yang disusun.

2. Masalah

Mari fahami masalahnya. Kami mempunyai dua susunan yang disusun dan kami ingin menggabungkannya menjadi satu.

3. Algoritma

Apabila kita menganalisis masalah, cukup mudah untuk memerhatikan bahawa kita dapat menyelesaikan masalah ini dengan menggunakan operasi penggabungan Merge Sort.

Katakan kita mempunyai dua susun atur foo dan bar panjang fooLength dan barLength , masing-masing. Seterusnya, kita boleh mendeklarasikan susunan lain yang digabungkan dengan ukuran fooLength + barLength .

Kita kemudiannya harus melintasi kedua-dua array dalam gelung yang sama. Kami akan mengekalkan nilai indeks semasa untuk masing-masing, fooPosition dan barPosition . Pada iterasi tertentu dari loop kita , kita mengambil array mana saja yang mempunyai elemen bernilai lebih kecil pada indeks mereka dan memajukan indeks itu. Elemen ini akan menempati kedudukan seterusnya dalam larik gabungan .

Akhirnya, setelah kami memindahkan semua elemen dari satu array, kami akan menyalin baki yang lain dari array yang digabungkan .

Sekarang mari kita lihat proses dalam gambar untuk lebih memahami algoritma.

Langkah 1:

Kita mulakan dengan membandingkan unsur-unsur dalam kedua-dua array, dan kita memilih yang lebih kecil.

Kemudian kami menaikkan kedudukan pada susunan pertama .

Langkah 2:

Di sini kita menambah kedudukan dalam array kedua dan beralih ke elemen seterusnya iaitu 8.

Langkah 3:

Pada akhir lelaran ini, kami telah melintasi semua elemen larik pertama .

Langkah 4:

Dalam langkah ini, kita hanya menyalin semua elemen yang tinggal dari susunan kedua ke hasil .

4. Pelaksanaan

Sekarang mari kita lihat bagaimana melaksanakannya:

public static int[] merge(int[] foo, int[] bar) { int fooLength = foo.length; int barLength = bar.length; int[] merged = new int[fooLength + barLength]; int fooPosition, barPosition, mergedPosition; fooPosition = barPosition = mergedPosition = 0; while(fooPosition < fooLength && barPosition < barLength) { if (foo[fooPosition] < bar[barPosition]) { merged[mergedPosition++] = foo[fooPosition++]; } else { merged[mergedPosition++] = bar[barPosition++]; } } while (fooPosition < fooLength) { merged[mergedPosition++] = foo[fooPosition++]; } while (barPosition < barLength) { merged[mergedPosition++] = bar[barPosition++]; } return merged; }

Dan mari kita teruskan dengan ujian ringkas:

@Test public void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() { int[] foo = { 3, 7 }; int[] bar = { 4, 8, 11 }; int[] merged = { 3, 4, 7, 8, 11 }; assertArrayEquals(merged, SortedArrays.merge(foo, bar)); }

5. Kerumitan

Kami melintasi kedua-dua tatasusunan dan memilih elemen yang lebih kecil. Pada akhirnya, kami menyalin elemen-elemen lain dari foo atau bar bar . Jadi kerumitan masa menjadi O (fooLength + barLength) . Kami telah menggunakan susunan tambahan untuk mendapatkan hasilnya. Jadi kerumitan ruang juga O (fooLength + barLength) .

6. Kesimpulannya

Dalam tutorial ini, kami belajar bagaimana menggabungkan dua susunan yang disusun menjadi satu.

Seperti biasa, kod sumber untuk tutorial ini boleh didapati di GitHub.