归并排序
算法思想:归并排序是典型的分治思想的体现;
1. 首先通过递归将数组划分为最小的子数组(长度为1);
2. 然后利用辅助数组将最小的两个数组合并为一个新的有序数组,然后回溯到上一个子数组,再进行合并,通过几轮的回溯合并就完成数组的排序;
实现代码:
package sort; import java.util.Arrays; /** * @author yangpeng * @create 2021-05-31 23:09 */ public class MergetSort { public static void main(String[] args) { int []arr={2,0,4,3,6,8,2}; int [] temp=new int[arr.length]; //声明一个与原数组一样大的辅助数组 mergetSort(arr,0,arr.length-1,temp); System.out.println(Arrays.toString(arr)); } /** * 分割数组,即“分” * @param arr * @param left * @param right * @param temp */ public static void mergetSort(int[] arr,int left,int right,int []temp){ //分 if(left<right){ int mid=(left+right)/2; //找到中间元素下标,利用递归进行分割 mergetSort(arr,left,mid,temp); mergetSort(arr,mid+1,right,temp); merge(arr,left,right,temp); //分割到两个子数组都只有一个元素时进行合并,也就是“治”,这样数组就会从最小子数组进行合并,然后不断回溯,一直合并至原数组有序; } } /** * 合并子数组,即“治” * @param arr 待排序的数组 * @param left * @param right * @param temp */ public static void merge(int []arr,int left,int right,int [] temp){ int mid=(left+right)/2; //子数组的中间元素 int index=left; //辅助数组的初始下标 int l=left; //左边子数组的索引下标 int r=mid+1; //右边子数组的索引下标 while(l<=mid&&r<=right){ //将两个子数组合并到辅助数组中 if(arr[l]<arr[r]){ //选择两个子数组中较小的值赋给辅助数组 temp[index++]=arr[l++]; }else{ temp[index++]=arr[r++]; } } //若左边子数组还有元素未合并,则追加到辅助数组后面 while(l<=mid){ temp[index++]=arr[l++]; } //若右边子数组还有元素未合并,则追加到辅助数组后面 while(r<=right){ temp[index++]=arr[r++]; } //将临时数组的值赋给原数组 for(int i=left;i<=right;i++){ arr[i]=temp[i]; } } }