归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序是一种外部排序,主要用来解决内存限制,数据无法一次放入内存,而这时需要用来归并排序来进行数据的排序处理。
相比较来说,JDK库里大部分都优先采用快速排序。因为快排的空间复杂度更好。
测试程序:
public static void main(String[] args) { int[] arr = new int[20]; for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*100); } mergeSort(arr, 0, arr.length-1); System.out.println(Arrays.toString(arr)); } /** * 实现归并排序 * @param arr * @param i * @param j */ private static void mergeSort(int[] arr, int i, int j) { if(i < j) { int mid = (i+j)/2; /** * 以下的操作,先进行数组划分,直到划分为单个元素以后,逐级向上回溯 * 的时候,进行合并操作 */ mergeSort(arr, i, mid); mergeSort(arr, mid+1, j); merge(arr, i, j); // 合并两个有序的序列 } } /** * 合并两个有序的序列 * @param arr * @param low * @param high */ private static void merge(int[] arr, int low, int high) { int[] tmp = new int[high-low+1]; int mid = (low+high)/2; // i-mid mid+1-j int i=low; // [i, mid] int j=mid+1; // [mid+1, high] int idx=0; // 3 12 5 8 while(i <= mid && j <= high){ if(arr[i] > arr[j]){ tmp[idx++] = arr[j++]; } else { tmp[idx++] = arr[i++]; } } while(i <= mid){ // tmp[idx++] = arr[i++]; } while(j <= high){ tmp[idx++] = arr[j++]; } // 把tmp里面合并的有序段再写回arr的[low,high] for(int k=low; k<=high; ++k){ arr[k] = tmp[k-low]; } } }
运行结果:
[2, 8, 8, 10, 21, 25, 26, 29, 32, 41, 43, 50, 50, 64, 72, 73, 81, 85, 93, 97]