`

Algorithm之排序之归并排序

阅读更多
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
分享到:
评论

相关推荐

    归并排序C++实现的例子

    归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...

    算法设计 karatusuba's algorithm 二叉搜索 快速排序 归并排序

    karatusuba's algorithm 计算乘积 从键盘任意输入N个整数 排序后 二叉搜索查询 从键盘输入的某个任意整数的序号 键盘输入N个数 快速排序 将数组的某一段元素进行划分,小的在左边,大的在右边...键盘输入N个数 归并排序

    基于比较的排序算法汇总 选择排序法 插入排序法 归并排序法 快速排序法 堆排序法 冒泡排序法 希尔排序法

    本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡排序以及希尔排序。 1. **选择排序(Selection Sort)**: - 基本思想:在未排序的序列中找到最小(或...

    SCAU-8645归并排序.docx

    归并排序是一种基于分治策略的排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并成原问题的解。在这个SCAU-8645归并排序的例子中,我们看到了一个完整的C++实现。 首先,...

    C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

    归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。...

    直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序

    直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序的C++语言实现,亲测可行,二路归并排序未得到预期结果,望指正。

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    5. 归并排序:归并排序采用分治策略,将数组拆分为两半,分别排序后再合并。由于始终需要额外的空间,归并排序是稳定的排序算法,时间复杂度为O(n log n)。 6. 快速排序:快速排序的核心是“分而治之”,通过选取一...

    dd.rar_dd_dd-tools_sort algorithm_多关键字 排序_多关键字排序

    3. **归并排序**:归并排序本身支持多关键字排序,通过定义一个比较函数,将多个关键字的比较逻辑合并到一起。在归并过程中,可以同时考虑所有关键字,确保了正确性。 4. **堆排序**:堆排序也可以扩展到多关键字...

    sort-algorithm.rar_时间排序

    快速排序平均时间复杂度为O(n log n),而归并排序和堆排序在所有情况下都保证了O(n log n)的时间复杂度。 归并排序是一种分治策略,将大问题分解为小问题解决,然后合并结果。它将待排序序列分为两半,分别排序后再...

    查找和排序的各种C++ 实现,归并,冒泡,快速,选择

    归并排序首先将数组分为两半,分别对每一半进行排序,然后将已排序的两半合并成一个有序的数组。C++中通常使用递归实现归并排序,时间复杂度为O(n log n)。 2. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的...

    Sorting-Algorithm-summary.zip_排序

    本资料包“Sorting-Algorithm-summary.zip”聚焦于几种基本的排序算法,包括直接排序、冒泡排序、堆排序、二分法排序、归并排序和快速排序,以及较少提及的基数排序。下面我们将对这些算法进行详细介绍。 1. 直接...

    排序算法(插入、选择、归并、冒泡、堆排序)实现代码C++

    本资源提供了五种常见的排序算法的C++实现,包括插入排序、选择排序、归并排序、冒泡排序和堆排序。这些算法都是基于《算法导论》一书中的伪代码编写的。下面将详细解释这五种排序算法及其C++实现的关键点。 1. ...

    基础排序, 高级排序, 堆, 二分搜索树, 并查集, 图以及图相关算法知识总结

    归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分...

    C++实现6种排序算法对四种类型数据排序

    这些排序算法包括了冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,它们各自有其独特的性能特征和适用场景。以下是对这六种排序算法的详细解释以及如何在C++中实现它们。 1. 冒泡排序(Bubble Sort)...

    Algorithm_hash归并快排算法_

    标题中的"Algorithm_hash归并快排算法_"表明我们要讨论的是一个与哈希(Hash)合并和快速排序(Quick Sort)算法相关的编程实现。哈希合并通常用于数据处理和排序,而快速排序是一种高效的排序算法,它利用了分治的...

    algorithm.zip

    5. **归并排序**:归并排序是采用分治策略的排序算法,将大问题分解为小问题解决。它将数组分成两半,分别对每一半进行排序,然后合并两个已排序的子数组。归并排序保证了稳定的排序效果,时间复杂度为O(n log n),...

    用Java实现几种常见的排序算法

    用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。 插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm....

    C语言中数据结构之链表归并排序实例代码

    C语言中数据结构之链表归并排序实例代码 本文主要介绍了C语言中数据结构之链表归并排序实例代码的相关知识点,通过对链表归并排序的实现,帮助读者深入了解链表数据结构的应用。 一、链表数据结构 链表是一种常用...

    Algorithm-algorithm.zip

    - 排序算法:如冒泡排序、选择排序、插入排序、快速排序、归并排序等,用于调整数据的顺序。 - 搜索算法:如线性搜索、二分搜索、哈希搜索,帮助找到所需信息。 - 图算法:如Dijkstra算法、Floyd算法,用于处理...

    七大经典排序

    本文将深入探讨七大经典排序算法,包括堆与堆排序、归并排序、快速排序、冒泡排序、希尔排序、直接选择排序,以及它们在C++中的实现。 1. 堆排序:堆是一种特殊的树形数据结构,具有完全二叉树的特点。堆排序利用了...

Global site tag (gtag.js) - Google Analytics