归并排序时间复杂度O(N*logN),额外空间复杂度O(N)
具体实现过程请观看算法(c语言版)之归并排序
package yzy.algorithm;
public class testMergeSort {
public static void mergeSort(int[] arr) {
if(arr == null || arr.length<2)
return;
sortProcess(arr, 0, arr.length-1);
}
//实际排序的递归过程
public static void sortProcess(int[] arr, int L, int R) {
if(L == R)
return;
// int mid = (L-R)/2 + R;
int mid = ((L-R)>>1) + R;
sortProcess(arr, L, mid);
sortProcess(arr, mid+1, R);
merge(arr, L, mid, R);
}
public static void merge(int[] arr, int L, int mid, int R) {
int[] help = new int[R-L+1]; //开辟与要排序的数组相同大小额外的空间
int i = 0;
int p1 = L;
int p2 = mid+1;
while(p1<=mid && p2<=R) {
help[i++] = arr[p1]<arr[p2] ? arr[p1++] : arr[p2++];
}
while(p1 <= mid) {
help[i++] = arr[p1++];
}
while(p2<=R) {
help[i++] = arr[p2++];
}
for(i=0; i<help.length; ++i) {
arr[i+L] = help[i];
}
}
public static void main(String[] args) {
/*
* 疑惑????
* 验证后发现是运算符优先级的原因
* +优先级高于>>(移位操作符)
* (L-R)/2 + R尽量不要用负数做被除数,可能导致最终的结果不正确,要想保证结果正确,永远都要是大数减小数
* ((L-R)>>1) + R随意
*/
int L = 0, R = 3;
int mid1 = (L-R)/2 + R;
int mid2 = (R-L)/2 + L;
int mid3 = ((L-R)>>1) + R;
int mid4 = (L-R)>>1 + R;
int mid5 = R + (L-R)>>1;
int mid6 = R + ((L-R)>>1);
//尽量不要用负数做被除数,可能会不正确
System.out.println("(L-R)/2 + R: "+ mid1); //error
System.out.println("(R-L)/2 + L: "+ mid2);
System.out.println("(L-R)/2: "+ (L-R)/2); //-1+3
System.out.println("(R-L)/2: "+ (R-L)/2); //1+0
// +优先级高于>>
System.out.println("((L-R)>>1) + R: "+ mid3);
System.out.println("(L-R)>>1 + R: "+ mid4); //error +优先级高于>>
// +优先级高于>>
System.out.println("R + (L-R)>>1: "+ mid5); //error +优先级高于>>
System.out.println("R + ((L-R)>>1)): "+ mid6);
}
}