`
旭冬冬
  • 浏览: 12789 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

二路归并排序的奥妙

阅读更多
   二路归并排序,顾名思义就是指将两个有序表组合成一个新的有序表。那么对于一个任意的待排序的数组,又该如何实现呢?
   让我们假设一个整形数组为{1,3,4,2,5},我们需要对它进行归并排序。按照我们刚才对二路归并的定义可知,我们得把这个数组一分为二,然后对左右两边的数组分别排序之后,再把两者归并到一起,就能将无序变为有序了。也许你会有疑问,我将原数组分成左右两个数组之后,又要用什么方法来给左右数组排序呢?不难想到,我们可以继续拆分数组,即将左边的数组看成待排序的数组,继续将其拆分成两个数组。同理,右边亦是如此。那么到什么时候拆分结束呢?很简单,当我们将数组拆分成仅有一个元素的数组时,拆分结束!因为继续拆分已经没意义了哦。
这样的话,你可能会问,拆分完成之后又该怎么归并呢?也许大家都会有或多或少的不习惯,因为我们是顺序将数组拆分,但需要逆序对数组归并。也就是说先归并元素个数为1的数组,再归并元素个数为2或更多的数组,直到最后只剩下两个数组,二者元素个数之和恰好为待排序数组元素之和。将二者归并之后,即得到顺序的数组。
   下面贴上我写的归并排序代码。
  
/**
 * 归并排序
 * 
 * @author Star
 * 
 */
public class MergeSortByStar {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int array[] = { 1, 3, 4, 2, 5, 57, 78, 23, 1 };
		mergeSort(array);
		for (int i = 0; i < array.length; i++) {
			System.out.println(array[i]);
		}
	}

	/**
	 * 
	 * @param array
	 *            待排序的数组
	 */
	public static void mergeSort(int array[]) {
		mSort(array, 0, array.length - 1);
	}

	/**
	 * 
	 * @param array
	 *            待排序数组
	 * @param start
	 *            排序的起点
	 * @param end
	 *            排序的终点
	 */
	private static void mSort(int array[], int start, int end) {
		if (start >= end)
			return;
		int center = (start + end) / 2;// 将数组拆分成两段
		//二路归并
		mSort(array, start, center);// 给左边的数组排序
		mSort(array, center + 1, end);// 给右边的数组排序
		merge(array, start, center, end);// 将左右两边的数组进行归并
	}

	/**
	 * 将左右两边的数组进行归并
	 * @param array
	 *            待排序数组
	 * @param start
	 *            排序起点
	 * @param center
	 *            排序中点
	 * @param end
	 *            排序终点
	 */
	private static void merge(int array[], int start, int center, int end) {
		int index = start;// 从第一个位置出发
		int i = start;
		int j = center + 1;
		int[] tmp = new int[end+1];//创建一个缓存数组
		//比较左右两边数组,并用缓存数组接收较小的数
		for (; i <= center && j <= end; index++) {
			if (array[i] < array[j])
				tmp[index] = array[i++];
			else
				tmp[index] = array[j++];
		}
		//缓存数组接受剩下的数据
		//如果左边还有的话,接受左边
		while (i <= center) {
			tmp[index++] = array[i++];
		}
		//如果右边还有的话,接受右边
		while (j <= end) {
			tmp[index++] = array[j++];
		}
		// 将临时数组复制给原数组
		while (start <= end) {
			array[start] = tmp[start];
			start++;
		}
	}
}

以上代码即是我之前分析的具体实现。如果大家对我有什么建议,欢迎指正,交流。
 
分享到:
评论

相关推荐

    二路归并排序

    二路归并排序 二路归并排序是指将两个有序表归并成一个有序表的过程。它是一种常用的排序算法,特别是在外部排序和数据库管理系统中。下面是对给定文件的知识点解释: 归并排序 归并排序是一种基于比较的排序算法...

    C语言二路归并排序算法

    ### C语言二路归并排序算法 #### 概述 归并排序是一种高效的排序算法,其基本思想是采用分治法(Divide and Conquer),将一个数组分成两个子数组,然后递归地对这两个子数组进行排序,最后将两个有序的子数组合并...

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    二路归并算法排序

    "二路归并算法排序" 二路归并算法排序是归并排序的一种实现方式,通过将两个有序表合并成为一个更大的有序表来实现排序。该算法的基本思想是将原始数组分成两个小数组,分别对这两个小数组进行排序,然后将两个有序...

    三路归并_C语言_三路归并排序_三路归并_

    **三路归并排序**是一种高效的排序算法,尤其在处理含有大量重复元素的序列时表现优秀。该算法基于归并排序的思想,但将其分为三个部分处理,而不是传统的两个部分。在本文中,我们将深入探讨三路归并排序的原理、...

    二路归并排序算法(递归实现)

    递归实现的二路归并排序算法,其中对结构体按其内部一个关键字(本例是对一个任务结构体,按其收益排序)进行排序

    MATLAB实现插入排序、二分归并排序、归并排序.rar

    在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...

    单链表为存储结构, 实现二路归并排序的算法

    二路归并排序是一种高效的排序算法,尤其适用于大型数据集,其主要思想是将大问题分解为小问题,再通过合并解决。在这个场景中,我们使用单链表作为存储结构来实现二路归并排序,这与传统的数组或动态数组有所不同,...

    归并类\二路归并排序

    二路归并排序是一种高效的、基于分治策略的排序算法,它将大问题分解为小问题,然后将小问题的结果合并成最终的解决方案。在这个过程中,我们不使用递归,而是采用迭代的方式来实现。下面是对二路归并排序的详细解释...

    数据库系统实现-两阶段多路归并排序算法的C实现

    两阶段多路归并排序算法主要分为两个阶段:第一阶段是构建归并树,第二阶段是进行归并操作。 1. **第一阶段:构建归并树** 在这个阶段,数据被分割成若干个较小的块,每个块都可以独立排序。这些块被称为“路”。...

    /*.编写完整的二路归并排序程序。*/

    /*.编写完整的二路归并排序程序。*/ /*.编写完整的二路归并排序程序。*/

    MATLAB二分归并排序算法实验.rar

    二分归并排序是一种高效的排序算法,它结合了分治策略和归并操作。在MATLAB环境中实现二分归并排序,可以让我们更好地理解和运用这种算法。以下将详细阐述二分归并排序的工作原理、MATLAB实现过程以及相关知识点。 ...

    C语言算法之归并排序C语言算法之归并排序

    #### 二、归并排序的基本步骤 归并排序主要由两个关键步骤组成: 1. **分解**: 将原始数组分成尽可能相等的两个子数组。 2. **合并**: 对每一个子数组递归地执行归并排序,然后再将排序好的子数组合并为一个有序...

    外排序(磁盘排序)之多路归并排序的简单实现

    ### 外排序(磁盘排序)之多路归并排序的简单实现 #### 知识点概述 在计算机科学领域,排序算法是数据处理的重要组成部分。对于内存足够存放所有待排序元素的情况,我们通常采用诸如快速排序、堆排序等内部排序方法...

    java二路归并排序示例分享

    "java二路归并排序示例分享" java二路归并排序是一种高效的排序算法,通过分治法将数组分成小的数组分别排序,然后将排序好的数组合并。下面是java二路归并排序示例的详细解释: 什么是二路归并排序 二路归并排序...

    归并排序 归并排序示例

    #### 二、归并排序原理 归并排序的基本步骤如下: 1. **分解**:如果当前数组长度大于1,则将其拆分成两个子数组。 2. **递归排序**:对左右两个子数组分别进行归并排序。 3. **合并**:将排序好的两个子数组合并...

    归并排序C语言实现

    归并排序是一种高效的排序算法,基于分治策略。在C语言中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:归并排序的核心思想是将大问题分解为小问题来解决。首先将数组分为两半,分别对两半进行...

    2-路归并排序,写一个算法在链表结构上实现这一策略

    2-路归并排序是一种高效的排序算法,特别适用于大数据量的场景。它的基本思想是将待排序的序列分成两个子序列,分别进行排序,然后将这两个已排序的子序列合并成一个有序序列。在这个过程中,通常会使用到链表结构,...

Global site tag (gtag.js) - Google Analytics