用java写归并排序
主要思想:先分再合,使用分治的方法
1,第一步,先说如何分
假设有数组8个数字,先分为4,在分为2,再分为1
这边使用递归,详情见图片
这样的话就将所有的数据递归,即将所有的数据给分开,再来组合
2,合
两两组合,在组合时并且比较大小
3,代码
package sanguigu.sort; import java.util.Arrays; /** * 快速排序,使用分治的方法 * @author:zhenghuisheng */ public class Kuaipai { public static void main(String Args[]){ int b[] = {3,1,4,2,5,7,9,8}; int temp[] = new int[b.length]; merge_sort(b,0,b.length-1,temp); System.out.println(Arrays.toString(b)); } //分 public static void merge_sort(int a[],int left,int right,int temp[]){ if(left < right){ int mid = (left + right) / 2; //中间索引 //向左递归分解 merge_sort(a,left,mid,temp); //向右递归 merge_sort(a,mid+1,right,temp); //在这进行递归时可以发现,在只有两个数据时,可以发现left=0,mid=(0+1)/2=0,所有数组a有至少两个数据 merge(a,left,mid,right,temp); } } /** * 合 * @param :数组 * @param left:左边的数 * @param mid:中间的数 * @param right:左边的数 * @param temp:临时数组 * */ public static void merge(int a[],int left,int mid,int right,int temp[]){ System.out.println("====="); int i = left; //左边的初始数据 int j = mid +1; //中间的数据 int t = 0; //临时变量数组的下标,在下标存入数据后,下标后移 //开始递归 while(i <= mid && j <= right){ //直接进行比较,如果值小的就将数据加入到临时数组中 if(a[i] >= a[j]){ temp[t] = a[j];t++;j++; } else {temp[t] = a[i];t++;i++;} } //如果还有剩余值 while(i <= mid){//即左边还有数据没有全部加入到临时数组中 temp[t] = a[i]; t = t+1; i = i+1; } while(j <= right){//即右边还有数据没有全部加入到临时数组中 temp[t] = a[j]; t = t+1; j = j+1; } //优化,并不是每次临时数组的值返回给原来的数组,而是将最后一次的数据值返回给临时数组 t= 0; int templeft = left; while(templeft <= right){ a[templeft] = temp[t]; t = t+1; templeft = templeft +1; } System.out.println(Arrays.toString(temp)); System.out.println(Arrays.toString(a)); } }