【数据结构与算法】二路归并排序

二路归并排序的时间复杂度是O(n*log2n),空间复杂度是O(n)。

代码如下:

/**
 * 源码名称:MergeSort.java
 * 日期:2014-08-11
 * 程序功能:合并排序
 * 版权:[email protected]
 * 作者:A2BGeek
 */
public class MergeSort {
	public void mergeSort(int[] in) {
		int length = in.length;
		int tmp[] = new int[length];
		mergePass(in, tmp, 0, length - 1);
	}

	public void mergePass(int[] in, int[] tmp, int start, int end) {
		if (start == end) {
			return;
		} else {
			int mid = (start + end) / 2;
			mergePass(in, tmp, start, mid);
			mergePass(in, tmp, mid + 1, end);
			merge2Sub(in, tmp, start, mid, end);
		}
	}

	/**
	 * 函 数 名:merge2Sub
	 * 功能描述:合并相邻的有序表
	 * 输入参数:
	 * @param a 待排序数组
	 * @param tmp 临时用于交换数据
	 * @param start 第一个有序表的起点索引
	 * @param mid 第一个有序表的终点索引
	 * @param end 第二个有序表的终点索引
	 */
	public void merge2Sub(int[] a, int[] tmp, int start, int mid, int end) {
		int i = start;
		int j = mid + 1;
		int k = 0;
		while (i <= mid && j <= end) {
			if (a[i] <= a[j]) {
				tmp[k] = a[i];
				i++;
				k++;
			} else {
				tmp[k] = a[j];
				j++;
				k++;
			}
		}
		while (i <= mid) {
			tmp[k] = a[i];
			i++;
			k++;
		}
		while (j <= end) {
			tmp[k] = a[j];
			j++;
			k++;
		}

		for (int index = 0; index < end - start + 1; index++) {
			a[start + index] = tmp[index];
		}
		printArray(a);
	}

	public void printArray(int[] in) {
		for (int i : in) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int[] testCase = { 1, 3, 4, 10, 2, 5, 6, 7, 9, 11 };
		MergeSort mMergeSort = new MergeSort();
		mMergeSort.printArray(testCase);
		mMergeSort.mergeSort(testCase);
		mMergeSort.printArray(testCase);
	}
}

【数据结构与算法】二路归并排序

时间: 2024-10-11 23:53:52

【数据结构与算法】二路归并排序的相关文章

python数据结构与算法 34 归并排序

归并排序 在提高排序算法性能的方法中,有一类叫做分而治之.我们先研究其中第一种叫做归并排序.归并排序使用递归的方法,不停地把列表一分为二.如果列表是空或只有一个元素,那么就是排好序的(递归基点),如果列表有超过1个的元素,那么切分列表并对两个子列表递归使用归并排序.一旦这两个列表排序完成,称为"归并"的基本操作开始执行.归并是把两个有序列表合并成一个新的有序列表的过程.图10是我们熟悉的列表样例分解过程,图11是归并的过程. 图10  切分过程 图11  归并过程 以下是mergeSo

排序算法——二路归并排序

二路归并排序主要运用了"分治算法",分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题. 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了"大"问题的解. 二路归并排序主旨是"分解"与"归并". 下面是参考<高性能JavaScript>中的代码: function merge(left, right) { var result = []; while(left.leng

【数据结构与算法】—— 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并.归并排序是一种稳定的排序方法. 归并介绍 前面有介绍,这里依然不做介绍 归并思想 核心思想:不断的将大的数组分成两个小数组,直到不能拆分为止,即形成了单个值.此时使用合并的排序思想对已经有序的数组进行合并,合并为一个大

【 python 学习笔记 -- 数据结构与算法 】归并排序 Merge Sort

[归并排序]这里我们利用递归算法不断地将列表一分为二,base case就是列表中没有元素或者只剩一个元素,因为此时这个子列表必然是正序的:然后再逐步把两个排序完成的子列表合并成一个新的正序列表,直到所有元素排序完毕. [示意图]这是一个从下至上的过程(Bottom-Up) 将列表不断从中间分成两个子列表,直到到达最底部,子列表中只有一个元素 然后,从下至上不断合并两个子列表,将两个子列表的所有元素排序形成一个新的列表. [ implementation of merge sort ] 可以利用

算法导论笔记(二)二路归并排序

二路归并排序 归并排序采用了一种”分而治之“的策略:将原问题分解成N个规模较小而结构与原问题相似的子问题:递归求解这些子问题,然后合并其结果,从而得到原问题的解. 分治模式一般遵循以下三个步骤: 分解(Divide):将原问题分解成若干子问题: 解决(Conquer):递归地求解各子问题.若子问题足够小,则直接求解: 合并(Combine):将子问题的解合并成原问题的解. ”二路归并"的算法也遵循以下三个步骤: 分解:将原序列中拥有的N个元素分解各含N / 2个元素的子序列: 解决:用合并排序法

排序算法大集锦_二路归并排序_2&3(分治思想)

第一段代码和合并排序差不多,用它来和第二段代码--二路归并排序作对比. 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <limits.h> #include <malloc.h> void merge(int *m, int x, int y, int z) { int b1,b2,i,j,k; b1=y

排序算法之二路归并排序

基本思想 首先将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将它们合并成一个序列. 代码 private void mergeSort(int[] a, int[] b, int left, int right) { if (left < right) { int middle = (left + right) / 2; mergeSort(a, b, left, middle); mergeSort(a, b, middle + 1, right); merge(a,

数据结构和算法之排序一:归并排序

我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不提升自己,最后也只会是一个码农.技术会日新月异,随时在发展更新换代,但是这几十年,有谁说过算法会过时,如果我们说java语言的发动机是各种开发手段和技术,那么我们可以毫不客气的说算法会是他的灵魂.一个程序员的提升和拔高一定是万丈高楼平地起,那么我希望这个地基一定是数据结构和算法,掌握这些原理以后其实

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数