By: 周杰
Date: 2012-12-16
Email: zhoujie338@126.com,sunwuwuzixu@gmail.com
Homepage: http://blog.youkuaiyun.com/shuhuai007
Copyright: 该文章版权由周杰所有。可在非商业目的下任意传播和复制。
package com.zhoujie.charpter2;
import java.util.Random;
public class MergeSort {
public static final String LOG_PREFIX = "=========";
public static final String ARR_DELIMITER = "\t";
public static final int ARRAY_LENGTH = 10;
public static final int ARRAY_MAX_VALUE = 100;
public static void main(String[] args) {
// 1. generate input array
Random random = new Random();
int[] intArr = new int[ARRAY_LENGTH];
printLine(LOG_PREFIX + "input arr is: ");
for (int i = 0; i < intArr.length; i++) {
intArr[i] = random.nextInt(ARRAY_MAX_VALUE);
print(intArr[i]);
if (i != intArr.length - 1) {
print(ARR_DELIMITER);
}
}
printLine("");
// 2. insert sort
mergeSort(intArr);
// 3. print sorted array
printLine(LOG_PREFIX + "output arr is: ");
printLine(join(intArr, ARR_DELIMITER));
}
public static void mergeSort(int [] intArr){
mergeSort(intArr, 0, intArr.length-1);
}
private static void mergeSort(int[] intArr, int p, int r) {
if(p < r){
int q = (p + r)/2;
mergeSort(intArr, p, q);
mergeSort(intArr, q+1, r);
merge(intArr, p, q, r);
}
}
private static void merge(int[] intArr, int p, int q, int r) {
int leftLength = q - p + 1;
int rightLength = r - q;
int[] leftArr = new int[leftLength + 1];
int[] rightArr = new int[rightLength + 1];
for(int i = 0; i < leftLength; i ++){
leftArr[i] = intArr[p + i];
}
leftArr[leftLength] = Integer.MAX_VALUE;
for(int j = 0; j < rightLength; j ++){
rightArr[j] = intArr[q + j + 1];
}
rightArr[rightLength] = Integer.MAX_VALUE;
int i = 0;
int j = 0;
for(int k = p; k <= r; k ++){
if(leftArr[i] <= rightArr[j]){
intArr[k] = leftArr[i];
i ++;
} else {
intArr[k] = rightArr[j];
j ++;
}
}
}
public static void print(Object t) {
System.out.print(t);
}
public static void printLine(Object t) {
System.out.println(t);
}
public static String join(int[] arr, String delimiter) {
StringBuilder sb = new StringBuilder();
for (int element : arr) {
sb.append(element);
sb.append(delimiter);
}
return sb.substring(0, sb.length());
}
}