MergeSort

归并排序有着很好的应用场景,它适合给大规模的数据排序,当数据量非常大时,内存排序困难可以对归并排序稍加改动让其支持分批从硬盘读取数据并进行排序,最后把结果进行合并。归并排序(二路归并)的主要思路就是假设两个数组A和数组B分别已经是排序好的,再对这两个数组A和B进行合并成为一个新的排序好的数组。这一步是归并排序的核心步骤,如果对于这个待排序数组来说,开始先对数组两个两个元素进行排序,在对其合并变成4个元素为一组,在变成8个元素为一组,从而到最后完成所有数据的排序。


package com.citi.byteman.test.arithmatic;

public class MergeSort {

	// 将有二个有序数列a[first...mid]和a[mid...last]合并
	/**
	 * merge two arrays(a[first...mid] & a[mid...last]) which sorted
	 * 
	 * @param a
	 * @param first
	 * @param mid
	 * @param last
	 * @param temp
	 */
	public void mergeArry(int[] a, int first, int mid, int last, int[] temp) {
		int i = first, j = mid + 1;
		int m = mid, n = last;
		int k = 0;
		while (i <= m && j <= n) {
			if (a[i] <= a[j])
				temp[k++] = a[i++];
			else
				temp[k++] = a[j++];
		}

		while (i <= m) {
			temp[k++] = a[i++];
		}

		while (j <= n) {
			temp[k++] = a[j++];
		}

		for (i = 0; i < k; i++) {
			a[first + i] = temp[i];
		}
	}

	public void mergeSort(int a[], int first, int last, int temp[]) {
		if (first < last) {
			int mid = (first + last) >> 1;
			mergeSort(a, first, mid, temp);// left part sort
			mergeSort(a, mid + 1, last, temp);// right part sort
			mergeArry(a, first, mid, last, temp);// merge two part
		}
	}


	public void printArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "\t");
		}
		System.out.println("");
	}

	public static void main(String[] args) {
		int[] a = { 6, 202, 100, 301, 38, 8, 1 };
		MergeSort t = new MergeSort();
		System.out.println("before sort:");
		t.printArray(a);
		int[] temp =new int[a.length];
		t.mergeSort(a, 0, a.length - 1, temp);
		System.out.println("after sort:");
		t.printArray(a);
	}
}

你可能感兴趣的:(归并排序,mergesort)