原理:先分解再合并,将数组进行拆分,当合并的时候比较两数组中数的大小进行合并
基本代码参照自http://blog.csdn.net/apei830/article/details/6591632
//归并排序
public static void MergeSort(int[]a,int left,int right){
//主函数带入时right为length - 1
if(left>=right){
return;
}
int index = (left+right)/2;
//先拆分再合并
MergeSort(a,left,index);
MergeSort(a,index+1,right);
Merge(a,left,index,right);
}
//合并
public static void Merge(int[]a,int left,int index,int right){
//存储新数组
int [] tmp = new int[a.length];
//从最左边开始一个个将数存放
int tmpIndex = left;
//第二个数组的最左边
int mid = index + 1;
//最后的数组复制用
int count = left;
//满足一个即退出,代表一个数组的值已经全部放入
while(left<=index&&mid<=right){
//找出最小值放在左边
if(a[left]<= a[mid]){
tmp[tmpIndex++] = a[left++];
}
else{
tmp[tmpIndex++] = a[mid++];
}
}
//两个while其实只执行一个,将另一个的余下数据放入
while(left<=index){
tmp[tmpIndex++] = a[left++];
}
while(mid<=right){
tmp[tmpIndex++] = a[mid++];
}
//copy
while(count<=right){
a[count] = tmp[count++];
}
}
稳定,时间复杂度O(logn)