归并排序(Mergesort)之Java实现

原创 2013年12月04日 22:19:34

归并排序算法介绍

归并排序是一个分治算法(Divide and Conquer)的一个典型实例,把一个数组分为两个大小相近(最多差一个)的子数组,分别把子数组都排好序之后通过归并(Merge)手法合成一个大的排好序的数组,归并的过程依然用扑克来解释,想象一下桌子上有两堆排好序(从小到大)的牌,每一次从两堆里面各抽取一张,比较一下两张的大小,如果两张一样大,都取出放到目标数组,否则取出较小的放到目标数组,另外一个放回原堆里面。归并排序需要额外的空间来存储临时数据,不过它的最坏运行时间都是O(nlogn)

归并排序算法Java实现

如《插入排序(Insertsort)之Java实现》一样,先实现一个数组工具类。代码如下:

 public class ArrayUtils {
	
	    public static void printArray(int[] array) {
		    System.out.print("{");
		    for (int i = 0; i < array.length; i++) {
			    System.out.print(array[i]);
			    if (i < array.length - 1) {
				    System.out.print(", ");
			    }
		    }
		    System.out.println("}");
	    }
    }

归并排序为分治法,体现在把一个数组分为基本等长的两个子数组,重复这个过程,直到两个子数组都只有一个元素,归并的过程是算法的核心,前面已经提到过。归并排序的Java实现以及测试代码如下:

 public class MergeSort {
	
		public static void main(String[] args) {
			int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };

			System.out.println("Before sort:");
			ArrayUtils.printArray(array);

			mergeSort(array);

			System.out.println("After sort:");
			ArrayUtils.printArray(array);
		}

		public static void mergeSort(int[] array) {
			sortArray(array, 0, array.length - 1);
		}

		private static void sortArray(int[] array, int start, int end) {
			// 单个元素不需要排序,直接返回
			if (start == end) {
				return;
			}

			int sortSize = end - start + 1;
			int seperate;
			if (sortSize % 2 == 0) {
				seperate = start + sortSize / 2 - 1;
			} else {
				seperate = start + sortSize / 2;
			}

			sortArray(array, start, seperate);
			sortArray(array, seperate + 1, end);

			mergeArray(array, start, seperate, end);
		}

		private static void mergeArray(int[] array, int start, int seperate, int end) {
			int totalSize = end - start + 1;
			int size1 = seperate - start + 1;
			int size2 = end - seperate;

			int[] array1 = new int[size1];
			int[] array2 = new int[size2];

			for (int i = 0; i < size1; i++) {
				array1[i] = array[start + i];
			}

			for (int i = 0; i < size2; i++) {
				array2[i] = array[seperate + 1 + i];
			}

			int mergeCount = 0;
			int index1 = 0;
			int index2 = 0;

			while (mergeCount < totalSize) {
				// 先检查有没有其中的一个数组已经处理完
				if (index1 == size1) {
					for (int i = index2; i < size2; i++) {
						array[start + mergeCount] = array2[i];
						mergeCount++;
						index2++;
					}
				} else if (index2 == size2) {
					for (int i = index1; i < size1; i++) {
						array[start + mergeCount] = array1[i];
						mergeCount++;
						index1++;
					}
				} else {
					int value1 = array1[index1];
					int value2 = array2[index2];

					if (value1 == value2) {
						array[start + mergeCount] = value1;
						array[start + mergeCount + 1] = value1;
						mergeCount += 2;
						index1++;
						index2++;
					} else if (value1 < value2) {
						array[start + mergeCount] = value1;
						mergeCount++;
						index1++;
					} else if (value1 > value2) {
						array[start + mergeCount] = value2;
						mergeCount++;
						index2++;
					}
				}
			}
		}
	}

相关文章推荐

Java排序算法(三)--归并排序(MergeSort)递归与非递归的实现

归并排序的思想是: 1.将原数组首先进行两个元素为一组的排序,然后合并为四个一组,八个一组,直至合并整个数组; 2.合并两个子数组的时候,需要借助一个临时数组,用来存放当前的归并后...
  • y999666
  • y999666
  • 2016年03月21日 09:39
  • 2769

Java练习:分治法之合并排序(merge Sort)

练习10-22.:解释arr3[k++] = arr2[j++]的等价代码,使用该技巧最大限度地减少上一练习中代码的行数。...
  • yqj2065
  • yqj2065
  • 2016年06月09日 17:59
  • 1797

归并排序Merge Sort LinkedList in Java

Merge Sort LinkedList in Java  package algorithm.sort; class ListNode { int val; ListNode next;...

MergeSort(Java)

实现代码:MergeSort.java public class MergeSort { public int[] sort(int[] input) { if (input...

合并文件的java实现

对2个有序的log文件进行合并,时间复杂度是线性的, 设计:读文件,把2个文件里的内容分别按行数据保存到数组中,然后合并数组数据,最后再写到文件中 在写这个程序的时候,处理合并数组的时候,灵光一现...
  • aaajj
  • aaajj
  • 2016年03月31日 22:11
  • 1186

排序算法之归并排序(JAVA)

public class MergeSort { /** * 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把...

Java排序算法(九):归并排序

Java排序算法(九):归并排序 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并...
  • apei830
  • apei830
  • 2011年07月08日 00:25
  • 41571

【排序算法】归并排序原理及Java实现

归并排序就是利用归并的思想实现的排序方法。而且充分利用了完全二叉树的深度特性,因此效率比较高。其基本原理如下:对于给定的一组记录,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序,...

java 实现二分归并排序

首先 解释一下什么是归并排序的精髓就是把一个乱序数组划分成小的数组来排序,然后再把小的数组合并成大的小组,下面的这张图能够明确说明什么是归并排序 虽然看图感觉二路归并排序很简单,但是实际操作起来还是...

普通表的Join 三种算法(join 一) 嵌套循环Join(Nested Loops Join)、排序合并Join(Sort-Merge Join)和哈希Join(Hash Join)

refer to http://mysun.iteye.com/blog/1748473 通过Map-Reduce实现Join系列之一 本系列的开篇在提到使用Map-Reduce实现Join之前,...
  • G7N3F
  • G7N3F
  • 2016年01月18日 16:58
  • 1309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序(Mergesort)之Java实现
举报原因:
原因补充:

(最多只允许输入30个字)