java归并排序
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,将大问题分治成一些小问题然后递归求解,治将分的阶段得到的答案修补在一起实现分而治之
归并排序具体图解如下
实例代码
public class MergeSorted {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] arr= {8,4,5,7,1,3,6,2};
int temp[]=new int[arr.length]; //辅助数组
mergeSort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(arr));
}
//分+治
public static void mergeSort(int[] arr,int left,int right,int[] temp) {
if(left<right) {
//中间索引
int mid=(left+right)/2;
//向左递归分解
mergeSort(arr,left,mid,temp);
//向又递归分解
mergeSort(arr,mid+1,right,temp);
//合并
merge(arr, left, mid,right, temp);
}
}
public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
int i=left;//初始化左有序索引
int j=mid+1;//初始化右边有序索引
int t=0; //索引辅助数组
//1
// 左右两边有序数组填充到temp中,直到有一边索引完毕
while(i<=mid&&j<=right) {
//
//左边元素小于右边元素
if(arr[i]<arr[j]) {
temp[t]=arr[i];
t++;
i++;
}
//
//右边元素小于左边元素
else{
temp[t]=arr[j];
t++;
j++;
}
}
//2 把一边的剩余元素放入辅助数组
while(i<=mid) {
//左边还有剩余元素
temp[t]=arr[i];
i++;
t++;
}
while(j<=right) {
temp[t]=arr[j];
j++;
t+=1;
}
//3 数组拷贝
t=0;
int tempLeft=left;
while(tempLeft<=right) {
arr[tempLeft]=temp[t];
t++;
tempLeft++;
}
}
}
[1, 2, 3, 4, 5, 6, 7, 8]