`
cooliufang
  • 浏览: 130214 次
社区版块
存档分类
最新评论

Java排序算法之 —— 合并(归并)排序

阅读更多
package algorithm.sort;

/**
 * 合并(归并)排序:按照分治模式,操作如下:
 * 分解:将n个元素分成各含n/2个元素的子序列
 * 解决:用合并排序法对两个子序列递归排序
 * 合并:合并两个已经排序的子序列已得到排序结果
 * @author Administrator
 */
public class MergeSort {
	/**
	 * 合并排序的关键在于合并两个已经排好序的子序列
	 * a[from, mid],a[mid+a, end]已排好序,合并成已排序的数组代替a[from, end]
	 * @param a
	 * @param from
	 * @param end
	 * @param mid
	 */
	
	//方法一:在过程中利用最大值作为哨兵值,来避免检查每个子序列是否为空
	//一旦两个子序列都出现这个哨兵值,说明所有的值都已经合并,复制回数组a
	public void merge1(int[] a, int from, int mid, int end) {
		//左右数组,且每个数组长度+1,为了存放哨兵值
		int nl = mid - from + 1;
		int nr = end - mid;
		int[] left = new int[nl + 1];
		int[] right = new int[nr + 1];
		System.arraycopy(a, from, left, 0, nl);
		System.arraycopy(a, mid+1, right, 0, nr);
	
		//哨兵值
		left[nl] = Integer.MAX_VALUE;
		right[nr] = Integer.MAX_VALUE;
		
		int i = 0;	//控制左边数组
		int j = 0;	//控制右边数组
		//从左右两个临时数组中各取一个数比较,将较小的一个数复制回数组
		for (int k = from; k <= end; k++) {	
			if (left[i] <= right[j]) { 
				//哨兵值在这里得到体现,如果其中一个复制完,就会一直复制另外一个
				a[k] =  left[i];
				i++;	//接着下一个
			} else {
				a[k] = right[j];
				j++;
			}
		}		
	}
	
	//方法二:不使用哨兵值,一旦其中的一个子序列所有元素都被复制回数组a,就立刻停止
	//再将另外一个子序列中剩余的元素复制回数组a即可
	public void merge2(int[] a, int from, int mid, int end) {
		//左右数组
		int nl = mid - from + 1;
		int nr = end - mid;
		int[] left = new int[nl];
		int[] right = new int[nr];
		System.arraycopy(a, from, left, 0, nl);
		System.arraycopy(a, mid+1, right, 0, nr);
		
		int i=0, j=0, k=from;
		//一旦其中一个子序列所有元素复制完就立刻停止
		while(i < nl & j < nr) {
			if(left[i] <= right[j]) {
				a[k++] = left[i++];
			} else {
				a[k++] = right[j++];
			}
		}
		
		//复制剩余的元素
		for(; i < nl; i++){
			a[k++] = left[i];
		}
		for(; j < nr; j++) {
			a[k++] = right[j];
		}
	}
	
	//递归划分数组
	public void mergeSort(int[] a, int from, int end) {
		//单个元素视为已排好序的
		if(from < end) {	
			//从中间划分数组
			int mid = (end + from) / 2;
			//递归划分数组
			mergeSort(a, from, mid);
			mergeSort(a, mid+1, end);
			merge2(a, from, mid, end);
		}
	}
	
	//对整个数组排序
	public void mergeSort(int[] a) {
		mergeSort(a, 0, a.length-1);
	}
	
	//打印数组
	public void printArr(String str, int[] a) {
		System.out.print(str + "\t");
		for(int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
		System.out.println();
	}
	
	//测试数据
	public static void main(String[] args) {		
		MergeSort ms = new MergeSort();
		int[] a = {1,4,3,7,5,8,0};
		ms.printArr("原始数组为:", a);
		ms.mergeSort(a);
		ms.printArr("合并排序后:", a);
		
	}
}


//output~
原始数组为: 1 4 3 7 5 8 0
合并排序后: 0 1 3 4 5 7 8
分享到:
评论

相关推荐

    快速排序算法以及归并算法

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    《Java数据结构和算法》学习笔记(5)——递归 归并排序

    在本篇《Java数据结构和算法》学习笔记中,我们将深入探讨递归和归并排序。递归是一种强大的编程技术,常用于解决复杂问题,而归并排序则是利用递归实现的一种高效排序算法。 首先,让我们理解什么是递归。递归是...

    快速排序与归并排序的算法比较实验报告

    这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...

    算法-归并排序(java)(csdn)————程序.pdf

    从上面的java实现代码可以看出,归并排序算法主要分为两个步骤:递归排序和合并排序。 1. 递归排序:在sort()方法中,我们将原始数组分成两个小数组,然后递归地对每个小数组进行排序。 2. 合并排序:在merge()方法...

    最快的排序算法 图解八大排序算法——我见过的最详细的讲解(转),排序算法数据结构

    归并排序是一种复杂的排序算法,思路是将数组分成两个部分,然后对每个部分进行排序,然后将两个部分合并起来,使得整个数组变得有序。时间复杂度为 O(nlogn),空间复杂度为 O(n)。 5. 快速排序 快速排序是一种...

    java面试java排序算法

    在Java面试中,排序算法是常见的话题,因为它在实际编程中有着广泛的应用。这里我们将讨论两种常见的排序算法:归并排序和堆排序。 首先,让我们深入理解归并排序(Merge Sort)。归并排序是一种分治策略,其基本...

    排序算法 Java经典算法

    首先,我们来看看基础的排序算法——冒泡排序。冒泡排序是最简单的交换排序,通过重复遍历待排序的数列,依次比较相邻元素并根据需要交换它们的位置,直到没有任何一对数字需要交换为止。虽然效率较低,但它对于理解...

    各种排序算法java实现

    标题 "各种排序算法java实现" 涉及到的是计算机科学中的一个重要领域——算法,特别是排序算法在Java编程语言中的具体应用。排序算法是数据结构与算法分析中的基础部分,它们用于将一组数据按照特定顺序排列。在这个...

    Java经典算法50题——答案下载!

    6. 分治策略:将大问题分解为小问题,分别解决后再合并结果,如快速排序、归并排序等。 7. 图论算法:包括最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)等。 在解题过程中,可能会用到...

    排序算法_java

    本文将深入探讨使用Java语言实现的五种经典排序算法:选择排序、冒泡排序、插入排序、希尔排序和归并排序。 首先,我们从最基础的排序算法开始——选择排序。选择排序的工作原理是每次从未排序的部分中找到最小(或...

    常用排序算法小结(附Java实现)

    文章可能涵盖了如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等多种经典的排序算法,并且通过Java代码进行了详尽的解释和实现。 1. 冒泡排序:这是一种简单的排序方法,通过重复遍历数组,比较相邻...

    Java常见排序算法

    冒泡排序是最基础的排序算法之一,通过不断地交换相邻的不正确顺序的元素来逐步完成排序。它的主要思想是重复地遍历待排序的序列,每次比较两个元素,如果它们的顺序错误就把它们交换过来。 2. **选择排序** ...

    JAVA排序算法

    在编程领域,排序算法是计算机科学的基础之一,尤其是在Java这样的高级编程语言中。排序是指将一组数据按照特定的顺序进行排列的过程。这篇文章将深入探讨Java中的一些主要排序算法,帮助开发者理解和掌握这些关键...

    java基础常用排序算法

    Java基础常用的排序算法是编程学习中的重要组成部分,尤其对于初学者来说,掌握这些排序方法能够提升编程能力并有助于解决实际问题。在这个主题中,我们将深入探讨几种常见的排序算法,包括冒泡排序、插入排序、选择...

    java实现各种排序算法及其速度对比(附详细代码)(csdn)————程序.pdf

    Java 提供了一个内置的排序方法 `Arrays.sort()`,它使用了TimSort算法,一种混合排序算法,结合了插入排序和归并排序的优点,对小规模数据和已部分排序的数据有很好的表现。在Java 8中,`Arrays.sort()`对于基本...

    排序算法c&java描述

    本资源包包含了两种编程语言——C和Java对于排序算法的详细描述,旨在帮助应聘者更好地理解和掌握这些算法,以应对软件公司的笔试挑战。 首先,让我们探讨排序算法的基本概念。排序是将一组无序的数据元素按照特定...

    java数组排序

    首先,让我们从最简单的排序算法——冒泡排序开始。冒泡排序是一种直观的排序方法,通过重复遍历数组,每次比较相邻两个元素并根据需要交换它们的位置,使得较大的元素逐渐“浮”到数组的顶端。其核心是两层循环结构...

    java基础数据结构-排序算法

    ### Java基础数据结构—排序算法...本文详细介绍了两种常见的排序算法——直接选择排序和堆排序,并给出了具体的Java实现代码。希望通过对这些算法的学习,能够帮助大家更好地理解和掌握排序算法的核心概念和技术细节。

Global site tag (gtag.js) - Google Analytics