归并排序Java版
package com.maple.mergesort;
import java.util.Arrays;
/**
* merge sort
*
* @author RhymeChiang
* @date 2017/12/07
**/
public class MergeSort {
/**
* merge sort main method
*
* @param a source data
* @param p the start index of the array
* @param r the last index of the array
* @return
*/
public static void mergeSort(int a[], int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(a, p, q);
mergeSort(a, q + 1, r);
merge(a, p, q, r);
}
}
/**
* unit operation of merge
*
* @param a source data
* @param p the start index of left sort array
* @param q the middle index of this array
* @param r the last index of right sort array
*/
private static void merge(int a[], int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
//cut and put the array into left and right sort array
//left one for stop
int left[] = new int[n1+1];
int right[] = new int[n2+1];
//init the data into the left and right sort array
for (int i = 0; i < n1; i++) {
left[i] = a[p+i];
}
for (int j = 0; j < n2; j++) {
right[j] = a[j + q+1];
}
left[n1]=Integer.MAX_VALUE;
right[n2]=Integer.MAX_VALUE;
//start merge sort
int i = 0;// the pointer of left array
int j = 0;// the pointer of right array
for (int k = p; k <= r; k++) {
if (left[i] >= right[j]) {
a[k] = right[j];
j++;
} else {
a[k] = left[i];
i++;
}
}
}
public static void main(String[] args) {
int a[] = new int[]{2,1,5,6,2,8,1,7,10,9};
mergeSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}
测试结果
算法时间复杂度O(nlgn)