//分治的思想,用二分法的思想,每次对一半进行排序,递归进行。如果能理解二叉树的遍历就很容易理解这个算法。
public class merge_sort {
public static void main(String[] args) {
int a[]={1,7,3,9,0,4,5,6};
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
mergeSort(a);
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
public static void mergeSort(int a[]){
sort(a,0,a.length-1);
}
public static void sort(int a[],int leftStart,int rightEnd){
if(leftStart==rightEnd)
return;
//int mid=(leftStart+rightEnd)/2;
//这两个一个意思 值右移一维就是除以2,>>带符号右移
int mid=leftStart+((rightEnd-leftStart)>>1);
sort(a,leftStart,mid);
sort(a,mid+1,rightEnd);
merge(a,leftStart,mid,rightEnd);
}
/**
*
* [@param](https://my.oschina.net/u/2303379) a 待排数组
* [@param](https://my.oschina.net/u/2303379) left //左子序列的起始位置
* [@param](https://my.oschina.net/u/2303379) mid //左子序列的起始位置
* [@param](https://my.oschina.net/u/2303379) right //右子序列的终止位置
*/
public static void merge(int a[],int left,int mid,int right){
//存储合并两个子序列的值
int temp[]=new int[right-left+1];
int pleft=left;
int pright=mid+1;
int i=0;
while (pleft<=mid&&pright<=right){
if(a[pleft]<a[pright]) {
temp[i] = a[pleft];
i++;
pleft++;
}
else
{
temp[i]=a[pright];
i++;
pright++;
}
}
//看还有哪个子集还有剩余元素,就将其插入temp中
while (pleft<=mid){
temp[i++]=a[pleft++];
}
while (pright<=right){
temp[i++]=a[pright++];
}
//把合并好的子集插入到原数组中
for(int j=0;j<temp.length;j++)
a[left+j]=temp[j];
}
}