我们先从数组中间分成前后两部分,然后对前后两部分分别排序,再将排序好的两部分合并。
归并排序的性能比选择排序和冒泡排序以及插入排序的性能要更好。
11,8,3,9,7,1,2,5
算法代码:
import java.util.Arrays;
public class MergeSort {
/**
* 归并排序
* @param args
*/
public static void main(String[] args) {
int arr[] = new int[]{11,8,3,9,7,1,2,5};
String result = Arrays.toString(mergeSort(arr));
System.out.println(result);
}
public static int[] mergeSort(int[] arr){
if(arr.length<2){
return arr;
}
int mid = arr.length/2;
int[] left = Arrays.copyOfRange(arr,0,mid);
int[] right = Arrays.copyOfRange(arr,mid,arr.length);
return merge(mergeSort(left),mergeSort(right));
}
//合并两个有序数组并且返回新的数组
public static int[] merge(int[] left,int[] right){
//创建就一个新的数组,这个数组的长度等于两个数组长度之和
int[] newArray = new int[left.length+right.length];
//定义两个指针分别代表两个数组的下标
int lindex = 0;
int rindex = 0;
for(int i=0;i<newArray.length;i++){
if(lindex>=left.length){
newArray[i] = right[rindex++];
}else if(rindex>=right.length){
newArray[i] = left[lindex++];
}else if(left[lindex] <right[rindex]){
newArray[i] = left[lindex++];
}else {
newArray[i] = right[rindex++];
}
}
return newArray;
}
}