在之前的文章中,我们学习了相当多的排序算法,例如冒泡排序、选择排序以及插入排序。我们了解到,虽然这些排序算法非常容易实现,但它们对于大型数据集来说效率不高,这意味着我们需要一种更有效的算法来处理大型数据集的排序,因此需要合并排序。在本系列中,我们将介绍合并排序的工作原理以及如何在 JavaScript 中实现它。你准备好了吗?
合并排序算法是一种遵循分治原则的优秀排序算法。与选择排序和冒泡排序等更简单的算法不同,这些算法多次遍历数组来比较相邻元素,合并排序采用了更具策略性的方法:
在处理较大的数据集时,这种方法始终优于更简单的 O(n²) 算法,例如选择排序和冒泡排序。
我们已经看到合并排序是通过使用流行的分而治之方法来工作的。下面是其工作原理的直观表示。
现在我们已经看到了它的魔力,让我们通过使用上述方法手动排序这个数组:[38, 27, 43, 3, 9, 82, 10]来了解合并排序算法的工作原理。
归并排序的第一步是将数组划分为子数组,然后将每个子数组划分为子数组,再将子数组划分为子数组,直到所有子数组中只剩下一项。
第二步是开始从头开始对这些子数组进行排序。
归并排序在所有情况下(最佳、平均和最差)都实现了 O(n log n) 时间复杂度,使其比处理较大数据集的 O(n²) 算法更高效。
原因如下:
将此与:
进行比较对于 1,000 个元素的数组:
归并排序需要 O(n) 的额外空间来存储合并期间的临时数组。虽然这超过了冒泡排序或选择排序所需的 O(1) 空间,但时间效率通常使得这种权衡在实践中是值得的。
// 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));
让我们看看它是如何排序的 [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++; } }
合并排序作为一种高效的排序算法脱颖而出,在大型数据集上始终表现良好。虽然与更简单的排序算法相比,它需要额外的空间,但其 O(n log n) 时间复杂度使其成为许多性能至关重要的实际应用程序的首选。
要点:
确保您不会错过本系列的任何部分,并与我联系以进行更深入的了解
关于软件开发(Web、服务器、移动或抓取/自动化)、数据的讨论
结构和算法,以及其他令人兴奋的技术主题,请关注我:
敬请期待并祝您编码愉快????
以上是了解合并排序算法:掌握排序算法的初学者指南的详细内容。更多信息请关注PHP中文网其他相关文章!