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)是一种非常重要的算法设计思想。它的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子...
算法基础:冒泡排序;直接插入排序;希尔排序;快速排序;堆排序;归并排序;基数排序_Algorithm
归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...
归并排序也是一种基于分治策略的排序算法,它将数组分成两半,递归地排序每一半,最后将两个已排序的子数组合并在一起。 #### 原理 1. 将数组分为两个子数组。 2. 递归地对每个子数组进行排序。 3. 合并两个已排序...
本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡排序以及希尔排序。 1. **选择排序(Selection Sort)**: - 基本思想:在未排序的序列中找到最小(或...
十个基础排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、桶排序、计数排_SortAlgorithm
归并排序是一种基于分治策略的排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并成原问题的解。在这个SCAU-8645归并排序的例子中,我们看到了一个完整的C++实现。 首先,...
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。...
5. 归并排序:归并排序采用分治策略,将数组拆分为两半,分别排序后再合并。由于始终需要额外的空间,归并排序是稳定的排序算法,时间复杂度为O(n log n)。 6. 快速排序:快速排序的核心是“分而治之”,通过选取一...
3. **归并排序**:归并排序本身支持多关键字排序,通过定义一个比较函数,将多个关键字的比较逻辑合并到一起。在归并过程中,可以同时考虑所有关键字,确保了正确性。 4. **堆排序**:堆排序也可以扩展到多关键字...
数据结构课设,用Java实现九种排序算法的动态演示。包括:堆排序、归并排序、基数排序、简单选择排序、_Sorting-Algorithm-Visualization
Python实现常见的排序算法:冒泡排序、快速排序、简单插入排序、希尔排序、归并排序、基数排序、直接_SortAlgorithm
快速排序平均时间复杂度为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)...
标题中的"Algorithm_hash归并快排算法_"表明我们要讨论的是一个与哈希(Hash)合并和快速排序(Quick Sort)算法相关的编程实现。哈希合并通常用于数据处理和排序,而快速排序是一种高效的排序算法,它利用了分治的...