一)定义
归并排序 (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),显然它不是就地排序。