排序08归并排序

一)定义

归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。

 

二)归并排序实现——两路归并(java)

package com.fox;

import java.util.Random;

/**
 * @author huangfox
 * @serial 合并排序
 */
public class MergeSort {

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

	/**
	 * 分治,采用
	 * 
	 * @param seq
	 * @param s
	 * @param e
	 */
	public static void mergeSort(int[] seq, int s, int e) {
		if (s < e) {
			int m = (s + e) / 2;
			mergeSort(seq, s, m);
			mergeSort(seq, m + 1, e);
			merge(seq, s, m, e);
		}
	}

	private static void merge(int[] seq, int s, int m, int e) {
		int n1 = m - s + 1;
		int n2 = e - m;
		int[] ls = new int[n1];
		for (int i = 0; i < ls.length; i++) {
			ls[i] = seq[s + i];
		}
		int[] rs = new int[n2];
		for (int i = 0; i < rs.length; i++) {
			rs[i] = seq[m + i + 1];
		}
		int index = s;
		int i1 = 0;
		int i2 = 0;
		while (i1 < n1 && i2 < n2) {
			if (ls[i1] < rs[i2]) {
				seq[index++] = ls[i1++];
			} else {
				seq[index++] = rs[i2++];
			}
		}
		while (i1 < n1) {
			seq[index++] = ls[i1++];
		}
		while (i2 < n2) {
			seq[index++] = rs[i2++];
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = new int[100000];
		Random random = new Random();
		for (int i = 0; i < a.length; i++) {
			a[i] = random.nextInt(100000);
		}
//		a = new int[] { 6, 7, 51, 2, 52, 8 };
		long bt = System.currentTimeMillis();
		MergeSort.sort(a);
		System.out.println(System.currentTimeMillis() - bt);
		 for (int a_ : a)
		 System.out.println(a_);

	}

}

归并排序——需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。

原文地址:https://www.cnblogs.com/huangfox/p/2571422.html