merge排序关键在于merge函数
import leet.ArrayUtils;
import java.util.Arrays;
/**
* Created by fhqplzj on 16-9-29 at 下午6:58.
*/
public class AnotherMergeSort {
private int[] aux;
public void merge(int[] nums, int lo, int mid, int hi) {
System.arraycopy(nums, lo, aux, lo, hi - lo + 1);
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
if (i > mid) {
nums[k] = aux[j++];
} else if (j > hi) {
nums[k] = aux[i++];
} else if (aux[i] < aux[j]) {
nums[k] = aux[i++];
} else {
nums[k] = aux[j++];
}
}
}
private void sort(int[] nums, int lo, int hi) {
if (lo < hi) {
int mid = (lo + hi) >>> 1;
sort(nums, lo, mid);
sort(nums, mid + 1, hi);
merge(nums, lo, mid, hi);
}
}
public void sort(int[] nums) {
int n = nums.length;
aux = new int[n];
sort(nums, 0, n - 1);
}
public void sortBottomUp(int[] nums) {
int n = nums.length;
aux = new int[n];
for (int size = 1; size < n; size *= 2) {
for (int lo = 0; lo + size < n; lo += 2 * size) {
merge(nums, lo, lo + size - 1, Math.min(lo + 2 * size - 1, n - 1));
}
}
}
public static void main(String[] args) {
AnotherMergeSort anotherMergeSort = new AnotherMergeSort();
int[] nums = ArrayUtils.generateRandomIntArray(0, 100, 50);
System.out.println(Arrays.toString(nums));
anotherMergeSort.sortBottomUp(nums);
System.out.println(Arrays.toString(nums));
}
}