归并排序(归,递归;并,合并;可以理解为这两个过程)
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | |
归并排序 | O(log₂n) | O(log₂n) | O(log₂n) | O(1) |
算法思想:先将整个序列分为两半,对每一半分别进行归并排序,将得到两个有序序列,然后将这两个序列归并成一个序列即可。
/**
*归并排序:归并分开看,既有归(递归)又有并(合并)。
*Author:Mr.Wang
*/
public class MergeSort{
/**
* 递归过程
* @param arr
* @param low
* @param high
*/
public static void sort(int []arr,int low,int high){
if(low<high)
{
int mid=(low+high)/2;
sort(arr,low,mid);
sort(arr,mid+1,high);
merge(arr,low,mid,high);
}
}
/**
* 合并过程
* @param arr数组
* @param left
* @param mid
* @param right
*/
private static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left;
int j = mid+1;
int k = 0;
while(i<=mid&&j<=right){
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while(i<=mid){//将左边剩余元素填充进temp中
temp[k++] = arr[i++];
}
while(j<=right){//将右序列剩余元素填充进temp中
temp[k++] = arr[j++];
}
//此处不可想当然的认为只需将temp的地址值赋给arr就可以
//而且必须得一一对应,故采用了for循环。
//将temp中的元素全部拷贝到原数组中
for (int k2 = 0; k2 < temp.length; k2++) {
arr[k2 + left] = temp[k2];
}
}
public static void main(String []args){
int []arr={5,6,2,7,12,4,9,11};
sort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+",");
}
}
}