public class 归并排序 {
public static int[] mergeArray(int[] array1, int[] array2){
int[] tmp = new int[array1.length+array2.length];
int i = 0;
int s1 = 0;
int s2 = 0;
int e1 = array1.length-1;
int e2 = array2.length-1;
while(s1 <= e1 && s2 <= e2){
if(array1[s1] <= array2[s2]){
tmp[i++] = array1[s1++];
}else{
tmp[i++] = array2[s2++];
}
}
while(s1 <= e1){
tmp[i++] = array1[s1++];
}
while (s2 <= e2){
tmp[i++] = array2[s2++];
}
return tmp;
}
public static void mergeSort1(int[] array){
mergeSortFunc(array, 0, array.length-1);
}
public static void mergeSortFunc(int[] array, int low, int high){
if(low >= high){
return;
}
int mid = low + ((high-low)>>>2);
mergeSortFunc(array, low, mid);
mergeSortFunc(array, mid+1, high);
merge(array, low, high, mid);
}
public static void merge(int[] array, int low, int high, int mid) {
int[] tmp = new int[high-low+1];
int i = 0;
int s1 = low;
int s2 = mid+1;
int e1 = mid;
int e2 = high;
while(s1 <= e1 && s2 <= e2){
if(array[s1] <= array[s2]){
tmp[i++] = array[s1++];
}else{
tmp[i++] = array[s2++];
}
}
while(s1 <= e1){
tmp[i++] = array[s1++];
}
while (s2 <= e2){
tmp[i++] = array[s2++];
}
for (int j = 0; j < tmp.length; j++) {
array[j+low] = tmp[j];
}
}
public static void mergeSort2(int[] array){
int nums = 1;
while(nums < array.length){
for (int i = 0; i < array.length; i += 2*nums) {
int left = i;
int mid = left + nums - 1;
if(mid >= array.length){
mid = array.length-1;
}
int right = nums + mid;
if(right >= array.length){
right = array.length-1;
}
merge(array, left, right, mid);
}
nums *= 2;
}
}
public static void main(String[] args) {
int[] array1 = {1,3,5,7,9,10};
int[] array2 = {0,2,3,4,5,6,7,8};
int[] array = {2,4,5,3,5,67,5,4,34,5};
mergeSort2(array);
System.out.println(Arrays.toString(array));
}
}