关于排序,我们的选择排序和冒泡排序都比较好理解,但是归并排序一直不是很理解,所以最近看了一下:
原理:使用递归,对数组进行二分,最后进行合并的同时实现排序
代码实现:
/** * 二分 * @param arr */ public static void half(int[] arr) { int o = 0; int size = arr.length; int m = arr.length / 2; int n = arr.length - m; int[] left = new int[m]; int[] right = new int[n]; System.arraycopy(arr, 0, left, 0, m); System.arraycopy(arr, m, right, 0, n); if(arr.length > 1){ half(left); half(right); merge(left,right,arr); } }
/** * 排序合并 * @param arr 左边 * @param brr 右边 * @param temp 合并到的目标数组 * @return */ public static int[] merge(int[] arr, int[] brr, int[] temp) { int i = 0; int j = 0; int k = 0; for (int l = 0; l < temp.length; l++) { if(arr[i] < brr[j]){ temp[k] = arr[i]; i++; k++; if(i == arr.length){ System.arraycopy(brr,j,temp,k,brr.length-j); break; } }else { temp[k] = brr[j]; j++; k++; if(j == brr.length){ System.arraycopy(arr,i,temp,k,arr.length-i); break; } } } return temp; }
调用:
static int[] data = {20,10,30,40,60,50,70,90}; public static void main(String[] arg) { half(data); System.out.print(Arrays.toString(data)+"\n"); }
这是看了好久之后实现的:里面主要影响是递归的执行顺序,看了几片博文,得到的结论是:
递归执行顺序是先依次递归条件到结束,然后再按照前面的顺序反向执行操作到结束(注意顺序)
而上面在递归的时候,half(left)执行到一个元素后,继续执行的是half(right)....