归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。
步骤:
1. 分解(分):将一个数组一直对半分,直到元素的个数为一个时,一个元素就相当于是排好顺序的。
2. 合并(治):分解完成之后,从下往上2个有序数列合并,直到合并为一个有序数组。
java代码实现
public class guibing {
public static void main(String []args){
int []arr = {8,4,5,7,1,3,6,2};
sort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
private static void sort(int[] arr,int left,int right){
if(left<right){
int mid = (left+right)/2;
sort(arr,left,mid); //左边归并排序,使得左子序列有序
sort(arr,mid+1,right); //右边归并排序,使得右子序列有序
merge(arr,left,mid,right); //将两个有序子数组合并操作
}
}
private static void merge(int[] arr,int left,int mid,int right){
int i = left;//左序列指针
int j = mid+1;//右序列指针
int t = 0;//临时数组指针
int[] temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
while (i<=mid && j<=right){
if(arr[i]<=arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
}
}
while(i<=mid){//将左边剩余元素填充进temp中
temp[t++] = arr[i++];
}
while(j<=right){//将右序列剩余元素填充进temp中
temp[t++] = arr[j++];
}
t = 0;
//将temp中的元素全部拷贝到原数组中
while(left <= right){
arr[left++] = temp[t++];
}
}
}