package 排序算法.归并排序;
import java.util.Arrays;
/**
* 归并排序是典型的分治法应用,
* 总共分为两大步,
* 第一步:对给定待排序数组分解成两部分(主要采用递归的方法),每部分是有序的;
* 第二步,合并这两部分;
*/
public class MegerSort {
public static void main(String[] args) {
int[] array = {0,12,-5,3,8,4,2,-7,1};
mergerSort(array, 0, array.length-1);
System.out.println(Arrays.toString(array));
}
//递归这个方法分解待排序数组
public static void mergerSort(int[] arry,int low,int high){
//递归终止的出口
if(low >= high){
return;
}
int mid = (low + high) / 2;
//分而治之左区间
mergerSort(arry, 0, mid);
//分而治之右区间
mergerSort(arry, mid+1, high);
//合并
meger(arry,low,mid,high);
}
//合并的方法
public static void meger(int[] arry,int low,int mid,int high){
int s1 = low; //第一个归并段的初始位置
int s2 = mid+1; // 第二个归并段的初始位置
//声明一个用于存放元素的数组
int[] res = new int[high - low + 1];
int i = 0;//表示res数组的下标
//要保证两个归并段都有数据
while(s1 <= mid && s2 <= high){
if(arry[s1] < arry[s2]){
res[i] = arry[s1];
s1++;
i++;
}else{
res[i] = arry[s2];
s2++;
i++;
}
}
//如果只剩下一个归并段时
while (s1 <= mid){
res[i] = arry[s1];
s1++;
i++;
}
while (s2<= high){
res[i] = arry[s2];
s2++;
i++;
}
//每次合并完将res数组放到array数组合适的位置
for(int j = 0;j<res.length;j++){
arry[j+low] = res[j];
}
}
}
归并排序算法
于 2021-12-14 13:32:58 首次发布