归并排序:就是把数组拆分,把拆分后的数组进行排序,然后在合并。图如下所示:
代码实现如下:
package guibing;
import java.util.Arrays;
public class MergeSortDemo {
private int [] arr;
public MergeSortDemo(int[] arr){
this.arr=arr;
}
/**
* @param arr 要排序的数组
* @param low 排序数组的起始下标
* @param hight 排序数组的结束位置
* @return 返回排序后的数组*/
public int[] sort(int[] arr,int low,int hight){
int mid=(low+hight)/2;//取中间的位置
if(low<hight){//如果小的小标比大的下标小,则说明数组还要拆分
sort(arr,low,mid);//给左边的进行拆分,在排序
sort(arr,mid+1,hight);//给右边的拆分,在排序
mergeSort(arr,low,mid,hight);// 合并
}
return arr;
}
/**
* @param arr 要排序的数组
* @param low 合并的下界
* @param hight 合并的上届
* */
private void mergeSort(int[] arr, int low, int mid, int hight) {
int i=low;
int j=mid+1;
int index=0;
//定义一个零时数组,
int[] temp=new int[(hight-low+1)];、
//给零时数组赋值
while(i<=mid&&j<=hight){
if (arr[i] < arr[j]) {
temp[index++] = arr[i++];
} else {
temp[index++] = arr[j++];
}
}
while(i<=mid){
temp[index++]=arr[i++];
}
while(j<=hight){
temp[index++]=arr[j++];
}
//吧零时数组的值赋给原数组
for(int i1=0;i1<temp.length;i1++){
arr[i1+low]=temp[i1];
}
}
public static void main(String []a){
int[] arr={123,5456,463,3478,858,9,2,88,34};
MergeSortDemo m=new MergeSortDemo(arr);
arr=m.sort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}