`
flashdream8
  • 浏览: 668492 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

归并排序的一例子

 
阅读更多
public class MergeSort {
	public static void mergeSort(int[] data) {
		System.out.println("开始排序:");
		sort(data, 0, data.length - 1);
	}

	/*
	 * 将索引从left到right范围的数组元素进行归并排序 data 待排序数组 left 待排序数组的第一个元素索引 right
	 * 待排序数组的最后一个元素索引
	 */
	private static void sort(int[] data, int left, int right) {
		// TODO Auto-generated method stub
		if (left < right) {
			// 找出中间索引
			int center = (left + right) / 2;
			// 对左边数组进行递归
			sort(data, left, center);
			// 对右边数组进行递归
			sort(data, center + 1, right);
			// 合并
			merge(data, left, center, right);

		}
	}

	/*
	 * 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序 data 数组对象 left 左数组的第一个元素的索引 center
	 * 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 right 右数组的最后一个元素的索引
	 */
	private static void merge(int[] data, int left, int center, int right) {
		// TODO Auto-generated method stub
		int[] tmpArr = new int[data.length];
		int mid = center + 1;
		// third记录中间数组的索引
		int third = left;
		int tmp = left;
		while (left <= center && mid <= right) {
			// 从两个数组中取出最小的放入中间数组
			if (data[left]<=(data[mid])) {
				tmpArr[third++] = data[left++];
			} else {
				tmpArr[third++] = data[mid++];
			}
		}
		// 剩余部分依次放入中间数组
		while (mid <= right) {
			tmpArr[third++] = data[mid++];
		}
		while (left <= center) {
			tmpArr[third++] = data[left++];
		}
		// 将中间数组中的内容复制回原数组
		while (tmp <= right) {
			data[tmp] = tmpArr[tmp++];
		}
		System.out.println(Arrays.toString(data));
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] data = {1,33,12,10,8,0,89,100,20,23,98};
		System.out.println("排序之前:\n" + Arrays.toString(data));
		mergeSort(data);
		System.out.println("排序之后:\n" + Arrays.toString(data));
	}

}

 

分享到:
评论

相关推荐

    归并排序 归并排序示例

    归并排序,比较高效的排序算法之一。这是一个例子,一个关于归并排序的例子。

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

    用C++实现归并排序,题目基于MIT的算法导论中的第二章中的归并排序算法要求,visual studio 2010 实现

    C++实现归并排序

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

    C#九种排序法例子

    C#九种排序法例子(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,归并排序,基数排序,计数排序)

    python实现折半查找和归并排序算法

    今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。 折半查找 先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序...

    Javascript排序算法之合并排序(归并排序)的2个例子

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待...

    内部排序算法合集(插入、希尔、起泡、快速、选择、堆、归并和基数排序)

    // 归并排序 //MergeSort( a ); // 基数排序 { SLList b; int i; b.keynum = 3, b.recnum = LENGTH;// 对3位整数进行基数排序 for ( i = 1; i ; i++ ) { b.r[i].keys[0] = objArray[i-1] % 10;//...

    Python编程中归并排序算法的实现步骤详解

    基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小...

    java策略模式的排序算法例子

    利用java策略模式编写的一个排序方法切换,的小例子。用于学习策略模式是很好的方式。界面写的还可以,仅供大家参考学习

    各种排序算法及java例子

    有插入 堆 冒泡 选择 归并 快速排序等相关例子

    MergeSort.rar

    简单的归并排序实现例子

    四种排序代码

    冒泡排序,归并排序,插入排序,快速排序, 包含以上四种排序的实现函数,可以直接调用。 适合初学者学习。

    JavaScript希尔排序、快速排序、归并排序算法

    为例子。 1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。 function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap&gt;0){ for (var k...

    8中基本排序方法

    基本的几种排序方法的例子,包含冒泡 快速排序 直接排序 归并排序 希尔排序 堆排序 基数排序

    内部排序的主要算法及相关可实现程序.rar_hill_内部排序_希尔排序_插入排序

    内部排序的所有算法,而且有相关可执行例子,包括插入排序,选择排序,希尔排序,快速排序,堆排序,归并排序等,很全,很孀。

    数据结构排序方法总结.docx

    归并排序; 分配类排序; 一、插入类排序 基本思想是:在一个已经排好序的序列中,每一步都将下一个待排序的记录插入到已排好序的记录中,直到所有待排序的记录全部插入为止。 插入类排序又分为三大类: 直接插入...

    c语言例程大全,帮你学习c编程

    * 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...

    C语言例程库(CLEL_v2.2)

    * 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...

    高效数据结构及算法模块源码

    易语言官方支持库以及网上流传的很多模块中的很多命令或...当前已支持算法:快速排序、插入排序、堆排序、归并排序、取最大、取最小、向下取整、向上取整、反转字节集、反转文本、反转数组、扩展欧几里得、中国剩余定

Global site tag (gtag.js) - Google Analytics