Algorithm之排序之归并排序
一、归并介绍
动画1:
动画2:
归并排序(英语:Merge sort,或 mergesort),
是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。
1945年由约翰·冯·诺伊曼首次提出。
该算法是采用
分治法(Divide and Conquer)的一个非常典型的应用,
且各层分治递归可以同时进行。
时间复杂度 O(n log n)
时间复杂度最优 O(n)
时间复杂度平均 O(n log n)
空间复杂度 O(n)
执行过程:
通过动画可以看出,归并排序的执行过程是:先分再排。
——先将最大集合分成小集合,递归直至最小的单个集合。
——再对小集合进行排序组成二级小集合。
——以此类推而形成最大的集合。
二、具体实现
1、Javascript:
Array.prototype.merge_sort = function() {
if (this.length == 1) return this;
var mid = this.length >> 1;
var merge = function(left, right) {
var _final = [];
while (left.length && right.length)
_final.push(left[0] <= right[0] ? left.shift() : right.shift());
return _final.concat(left.concat(right));
};
return merge(this.slice(0, mid).merge_sort(), this.slice(mid).merge_sort());
};
// Array.prototype.shift()
// The shift() method removes the first element
// from an array and returns that element.
测试:
var arr = [1,23,14,8,10,9,235,21];
// merge_sort() 方法返回一个新数组
arr.merge_sort();
// [1, 8, 9, 10, 14, 21, 23, 235]
// 并未改变原来的数组。
arr
// [1, 23, 14, 8, 10, 9, 235, 21]
2、Java 版本:
static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, result, start1, end1);
merge_sort_recursive(arr, result, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
result[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
result[k++] = arr[start1++];
while (start2 <= end2)
result[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = result[k];
}
public static void merge_sort(int[] arr) {
int len = arr.length;
int[] result = new int[len];
merge_sort_recursive(arr, result, 0, len - 1);
}
引自:
https://zh.wikipedia.org/wiki/归并排序
-

- 大小: 92.1 KB

- 大小: 13.1 KB
分享到:
相关推荐
### 分治策略与归并排序 #### 一、分治策略概述 在计算机科学领域,分治(Divide and Conquer)是一种非常重要的算法设计思想。它的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子...
归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...
冒泡排序、直接插入排序、希尔排序、快速排序、堆排序、归并排序和基数排序是七种常见的排序算法,它们各自具有不同的特点和适用场景。 冒泡排序是最简单的排序算法之一,它重复走访要排序的数列,一次比较两个元素...
归并排序也是一种基于分治策略的排序算法,它将数组分成两半,递归地排序每一半,最后将两个已排序的子数组合并在一起。 #### 原理 1. 将数组分为两个子数组。 2. 递归地对每个子数组进行排序。 3. 合并两个已排序...
本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡排序以及希尔排序。 1. **选择排序(Selection Sort)**: - 基本思想:在未排序的序列中找到最小(或...
九种排序算法包括:堆排序、归并排序、基数排序、简单选择排序、快速排序、插入排序、冒泡排序、希尔排序以及计数排序。每种排序算法都有其独特的应用场景和优缺点,例如: - 堆排序是基于二叉堆数据结构的一种排序...
归并排序是一种基于分治策略的排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并成原问题的解。在这个SCAU-8645归并排序的例子中,我们看到了一个完整的C++实现。 首先,...
具体而言,这九种排序算法包括堆排序、归并排序、基数排序、简单选择排序、快速排序(快排)、冒泡排序、希尔排序、折半插入排序以及直接插入排序。每种算法都有其独特的排序逻辑和应用场景。 堆排序是利用堆这种...
5. 归并排序:归并排序采用分治策略,将数组拆分为两半,分别排序后再合并。由于始终需要额外的空间,归并排序是稳定的排序算法,时间复杂度为O(n log n)。 6. 快速排序:快速排序的核心是“分而治之”,通过选取一...
其思想是将待排序的数组分割成两个子数组,分别对这两个子数组进行归并排序,最后将排序好的两个子数组合并成一个最终的排序数组。合并排序是一种稳定的排序方法,其最坏、最好和平均时间复杂度均为O(n log n),适合...
这使得基数排序在某些情况下比传统的比较排序算法(如快速排序、归并排序等)更高效,尤其是当数字的位数不是很多时。 然而,基数排序也有其局限性,比如当数字的位数非常大时,桶的数量就会非常庞大,这会导致空间...
3. **归并排序**:归并排序本身支持多关键字排序,通过定义一个比较函数,将多个关键字的比较逻辑合并到一起。在归并过程中,可以同时考虑所有关键字,确保了正确性。 4. **堆排序**:堆排序也可以扩展到多关键字...
快速排序平均时间复杂度为O(n log n),而归并排序和堆排序在所有情况下都保证了O(n log n)的时间复杂度。 归并排序是一种分治策略,将大问题分解为小问题解决,然后合并结果。它将待排序序列分为两半,分别排序后再...
归并排序首先将数组分为两半,分别对每一半进行排序,然后将已排序的两半合并成一个有序的数组。C++中通常使用递归实现归并排序,时间复杂度为O(n log n)。 2. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的...
本资料包“Sorting-Algorithm-summary.zip”聚焦于几种基本的排序算法,包括直接排序、冒泡排序、堆排序、二分法排序、归并排序和快速排序,以及较少提及的基数排序。下面我们将对这些算法进行详细介绍。 1. 直接...
二路归并排序是分治策略的一个经典应用。它首先将数组分成两半,然后递归地排序每一半,最后将两个有序的数组合并成一个有序数组。 #### 代码实现 二路归并排序的伪代码实现如下: ```cpp void Merge(int arr[], ...
本资源提供了五种常见的排序算法的C++实现,包括插入排序、选择排序、归并排序、冒泡排序和堆排序。这些算法都是基于《算法导论》一书中的伪代码编写的。下面将详细解释这五种排序算法及其C++实现的关键点。 1. ...
归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分...
这些排序算法包括了冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,它们各自有其独特的性能特征和适用场景。以下是对这六种排序算法的详细解释以及如何在C++中实现它们。 1. 冒泡排序(Bubble Sort)...
冒泡排序是一种简单的排序算法,它重复地走访过...冒泡排序算法因其简单性,在学习计算机科学和编程的初期阶段非常有价值,但随着数据处理量的增加,更高效的排序算法如快速排序、归并排序等会更适合处理大规模数据集。