public class MergeSort{
//测试程序
public static void main(String[] args){
int[] arr = {3,2,1,5,6,2};
process(arr,0,arr.length-1);
for(int i = 0;i<arr.length-1;i++){
System.out.println(arr[i]);
}
}
//使数组的某一段有序
public static void process(int[] arr,int left,int right){
if(left==right){
return;
}
//求中点位置,注意移位运算符的优先级比加号的优先级低,所以必须加括号
int middle = left+((right-left)>>1);
//使中点左边有序
process(arr,left,middle);
//使中点右边有序
process(arr,middle+1,right);
//合并左右两段
merge(arr,left,middle,right);
}
public static void merge(int[] arr,int l,int m,int r){
//辅助数组
int[] help = new int[r-l+1];
int i = 0;
int p1 = l;
int p2 = m+1;
while((p1<=m)&&(p2<=r)){
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=m){
help[i++] = arr[p1++];
}
while(p2<=r){
help[i++] = arr[p2++];
}
//将辅助数组中的元素copy到原数组之中
for(int j = 0;j<=help.length-1;j++){
arr[l+j] = help[j];
}
}
}时间复杂度利用master公式计算得到O(n*logN)

京公网安备 11010502036488号