归并排序(Merge Sort)是建立再归并操作上的一种有效的,稳定的排序算法,该算法是采用分治法(Divide and Conquer),将需要排序的数组通过递归的方式进行拆分成多层小的数组,对拆分后的子序列进行排序,再将已有的子序列合并,得到完全有序的子序列。也就是说,先将每个子序列有序,再使子序列间有序。分段可以理解为递归的拆分子序列的过程(递归的深度为:以2为底n的对数),将产生的若干子序列递归合并成一个真正的有序序列(递归深度同样为:以2为底n的对数)。

实例代码:
public class PracticeTest {
public static void main(String[] args) {
int []arr = {67,23,90,1,4,2,8,6};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
private static void sort(int [] arr){
int [] tmp = new int[arr.length];
mergeSort(arr,0,arr.length-1,tmp);
}
private static void mergeSort(int [] arr,int left,int right,int [] tmp){
if(left < right){
int med = (left+right)/2;//获取中值进行子序列拆分;
mergeSort(arr,left,med,tmp);//拆分左侧子序列;
mergeSort(arr,med+1,right,tmp);//拆分右侧子序列;
merge(arr,left,med,right,tmp);//合并子序列;
}
}
private static void merge(int [] arr,int left,int med,int right,int [] tmp){
//规定指针
int i = left;
int j = med + 1;
int t = 0;
//对两个子序列进行拆分
while(i <= med && j <=right){
if(arr[i] <= arr[j]){
tmp[t++] = arr[i++];
} else {
tmp[t++] = arr[j++];
}
}
//将左侧剩余的数据并入到tmp中
while(i <= med){
tmp[t++] = arr[i++];
}
//将右侧剩余的数据并入到tmp中
while(j<=right){
tmp[t++] = arr[j++];
}
t = 0;
//将tmp中排序完成的数组数据,更新到arr数组中去;
while(left <= right){
arr[left++] = tmp[t++];
}
}
}
本文详细介绍了归并排序(MergeSort)的工作原理,它是一种稳定的排序算法,基于分治策略。通过递归地拆分数组并合并已排序的子序列来实现排序。提供了一段Java代码实例,展示如何实现归并排序的过程,包括拆分、排序和合并子序列的步骤。
407

被折叠的 条评论
为什么被折叠?



