Dalam artikel kami sebelum ini, kami telah mempelajari tentang beberapa algoritma pengisihan seperti Isih Buih, Isih Pemilihan serta Isih Sisipan. Kami telah mengetahui bahawa walaupun algoritma pengisihan ini sangat mudah untuk dilaksanakan, ia tidak cekap untuk set data yang besar, yang bermaksud kami memerlukan algoritma yang lebih cekap untuk mengendalikan pengisihan set data yang besar, oleh itu pengisihan gabungan. Dalam siri ini, kita akan meneliti cara pengisihan gabungan berfungsi dan cara ia boleh dilaksanakan dalam JavaScript. Anda bersedia?
Algoritma Isih Gabung ialah algoritma pengisihan yang sangat baik yang mengikut prinsip bahagi-dan-takluk. Tidak seperti algoritma yang lebih mudah seperti Isih Pemilihan dan Isih Buih yang membuat beberapa hantaran melalui tatasusunan yang membandingkan elemen bersebelahan, Isih Gabungan mengambil pendekatan yang lebih strategik:
Pendekatan ini secara konsisten mengatasi prestasi algoritma O(n²) yang lebih mudah seperti Isih Pemilihan dan Isih Buih apabila berurusan dengan set data yang lebih besar.
Kami telah melihat bahawa isihan gabungan berfungsi dengan menggunakan pendekatan divide-and-conquer yang popular. Di bawah ialah gambaran visual tentang cara ia berfungsi.
Sekarang kita telah melihat keajaiban, mari kita lihat cara algoritma isihan gabungan berfungsi dengan mengisih tatasusunan ini secara manual: [38, 27, 43, 3, 9, 82, 10] menggunakan pendekatan yang disebutkan di atas.
Langkah pertama dalam isihan cantuman ialah membahagikan tatasusunan kepada subarray, dan kemudian membahagikan setiap subarray kepada subarray dan subarray kepada subarray sehingga kita hanya mempunyai satu item dalam semua subarray.
Langkah kedua ialah mula menyusun subarray tersebut dari bawah ke atas.
Isih Gabung mencapai kerumitan masa O(n log n) dalam semua kes (terbaik, purata dan paling teruk), menjadikannya lebih cekap daripada algoritma O(n²) untuk set data yang lebih besar.
Ini sebabnya:
Bandingkan ini dengan:
Untuk susunan 1,000 elemen:
Isih Gabungan memerlukan ruang tambahan O(n) untuk menyimpan tatasusunan sementara semasa penggabungan. Walaupun ini lebih daripada ruang O(1) yang diperlukan oleh Isih Buih atau Isih Pemilihan, kecekapan masa biasanya menjadikan pertukaran ini berbaloi dalam amalan.
// The Merge Helper Function function merge(left, right) { const result = []; let leftIndex = 0; let rightIndex = 0; while (leftIndex < left.length && rightIndex < right.length) { if (left[leftIndex] <= right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } } // Add remaining elements while (leftIndex < left.length) { result.push(left[leftIndex]); leftIndex++; } while (rightIndex < right.length) { result.push(right[rightIndex]); rightIndex++; } return result; }
const result = []; let leftIndex = 0; let rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) { if (left[leftIndex] <= right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } }
while (leftIndex < left.length) { result.push(left[leftIndex]); leftIndex++; }
function mergeSort(arr) { // Base case if (arr.length <= 1) { return arr; } // Divide const middle = Math.floor(arr.length / 2); const left = arr.slice(0, middle); const right = arr.slice(middle); // Conquer and Combine return merge(mergeSort(left), mergeSort(right)); }
if (arr.length <= 1) { return arr; }
const middle = Math.floor(arr.length / 2); const left = arr.slice(0, middle); const right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
Mari kita lihat bagaimana ia disusun [38, 27, 43, 3]:
// The Merge Helper Function function merge(left, right) { const result = []; let leftIndex = 0; let rightIndex = 0; while (leftIndex < left.length && rightIndex < right.length) { if (left[leftIndex] <= right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } } // Add remaining elements while (leftIndex < left.length) { result.push(left[leftIndex]); leftIndex++; } while (rightIndex < right.length) { result.push(right[rightIndex]); rightIndex++; } return result; }
const result = []; let leftIndex = 0; let rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) { if (left[leftIndex] <= right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } }
Merge Sort menonjol sebagai algoritma pengisihan yang sangat cekap yang konsisten berprestasi baik pada set data yang besar. Walaupun ia memerlukan ruang tambahan berbanding dengan algoritma pengisihan yang lebih mudah, kerumitan masa O(n log n) menjadikannya pilihan utama untuk banyak aplikasi dunia nyata yang prestasinya penting.
Pengambilan utama:
Untuk memastikan anda tidak terlepas mana-mana bahagian dalam siri ini dan berhubung dengan saya untuk lebih mendalam
perbincangan tentang Pembangunan Perisian (Web, Pelayan, Mudah Alih atau Mengikis / Automasi), data
struktur dan algoritma, dan topik teknologi menarik lain, ikuti saya di:
Nantikan dan selamat mengekod ???
Atas ialah kandungan terperinci Memahami algoritma isihan gabungan: Panduan pemula untuk menguasai algoritma isihan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!