归并排序是典型的分治策略。
- 归并操作:是合并两个已经排序的表,其思路是,设定两个指针p1和p2分别指向两个表,再新建一个临时数组,然后比较p2和p1把小的放进临时数组中,且对应的指针右移,重复此过程直到移动完成。
- 归并排序定义:如果N=1,那么只有一个元素需要排列,答案是显而易见的,否则递归的将前半部分和后半部分分别进行归并排序,得到排序后的数组,使用上面描述的归并操作进行合并即可。
void mergeort(int[] arr){
if(arr==null)throw new NullPointerException();
if(arr.length<=1)return;
int[] tmpArray = new int[arr.length];
mergeortCore(arr,0,arr.length-1,tmpArray);
}
void mergeortCore(int[] arr,int left,int right,int[] tmpArray){
//递归出口
if(left<right){
int center = left + ((right-left)>>>1);//notice
//1.分别对左右两部分递归排序
mergeortCore(arr,left,center,tmpArray);
mergeortCore(arr,center+1,right,tmpArray);
//2.然后合并左右两部分即可
int p1=left,p2=center+1;
int k=left;
while(p1<=center && p2<=right){
if(arr[p1]<=arr[p2]){
tmpArray[k++]=arr[p1++];
}else{
tmpArray[k++]=arr[p2++];
}
}
while(p1<=center)
tmpArray[k++]=arr[p1++];
while(p2<=right)
tmpArray[k++]=arr[p2++];
for(int i=right,k=right;i>=left;--i){//copy data back to arr
arr[i]=tmpArray[k--];
}
}
}