几种排序之归并排序

还是这个老哥写的好:https://blog.51cto.com/13733462/2115396

二路合并排序的基本思想是:对于两个有序表合并,初始时, 把含有n个结点的待排序序列看作有n个长度为1的有序子表所组成,将它们依次两两合并,得到长度为2的若干有序子表,再对这些子表进行两两合并,一直重复到长度为n,排序完成。

  1 package Sort;
  2 import java.util.Arrays;
  3 
  4 public class MergeSort {
  5     
  6     public static void mergeSort(int [] arr){
  7         
  8         if(arr ==null||arr.length<2){
  9             return ;            
 10         }
 11         sortProcess(arr, 0, arr.length-1);
 12     }
 13     
 14     public static void sortProcess(int []arr,int L,int R){
 15         if(L==R){
 16             return;
 17         }
 18         int mid = L+((R-L)>>1);//等同于(L+R)/2
 19         sortProcess(arr, L, mid);
 20         sortProcess(arr, mid+1, R);
 21         merge(arr,L,mid,R);
 22     }
 23     
 24     public static void merge(int []arr,int L,int mid,int R){
 25         int[] help= new int[R-L+1];
 26         int i =0;
 27         int p1 = L;
 28         int p2 = mid+1;
 29         while(p1<=mid && p2<=R){
 30             if(arr[p1]<arr[p2]){
 31                 help[i] = arr[p1];
 32                 p1++;
 33             }
 34             else{
 35                 help[i]=arr[p2];
 36                 p2++;
 37             }
 38             i++;
 39         }
 40         while(p1<=mid){
 41             help[i++] = arr[p1++];
 42         }
 43         while(p2<=R){
 44             help[i++]=arr[p2++];
 45         }
 46         
 47         for(i=0;i<help.length;i++){//把排序好的help拷贝回原数组
 48             arr[L] = help[i];
 49             L++;
 50         }
 51         
 52     }
 53     public static void comparator(int[] arr) {
 54         Arrays.sort(arr);//系统排序绝对正确的方法
 55     }
 56     
 57     public static int[] generateRandomArray(int maxSize, int maxValue) {//随机数发生器
 58         //Math.random 产生一个double [0,1)
 59         
 60         int[] arr = new int[(int) ((maxSize + 1) * Math.random())];//产生一个随机长度的数组
 61         for (int i = 0; i < arr.length; i++) {
 62             arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());//产生一个随机数,两个随机数减一下
 63         }
 64         return arr;
 65     }
 66     
 67     // for test
 68     public static int[] copyArray(int[] arr) {
 69         if (arr == null) {
 70             return null;
 71         }
 72         int[] res = new int[arr.length];
 73         for (int i = 0; i < arr.length; i++) {
 74             res[i] = arr[i];
 75         }
 76         return res;
 77     }
 78 
 79         // for test
 80     public static boolean isEqual(int[] arr1, int[] arr2) {
 81         if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
 82             return false;
 83         }
 84         if (arr1 == null && arr2 == null) {
 85             return true;
 86         }
 87         if (arr1.length != arr2.length) {
 88             return false;
 89         }
 90         for (int i = 0; i < arr1.length; i++) {
 91             if (arr1[i] != arr2[i]) {
 92                 return false;
 93             }
 94         }
 95         return true;
 96     }
 97     
 98     // for test
 99     public static void printArray(int[] arr) {
100         if (arr == null) {
101             return;
102         }
103         for (int i = 0; i < arr.length; i++) {
104             System.out.print(arr[i] + " ");
105         }
106         System.out.println();
107     }
108     
109 
110     public static void main(String[] args) {
111         
112         int testTime = 500000;
113         int maxSize = 10;
114         int maxValue = 100;
115         boolean succeed = true;
116         for (int i = 0; i < testTime; i++) {
117             int[] arr1 = generateRandomArray(maxSize, maxValue);
118             int[] arr2 = copyArray(arr1);
119             mergeSort(arr1);
120             comparator(arr2);
121             if (!isEqual(arr1, arr2)) {
122                 succeed = false;
123                 break;
124             }
125         }
126         System.out.println(succeed ? "Nice!" : "Fucking fucked!");
127 
128         int[] arr = generateRandomArray(maxSize, maxValue);
129         printArray(arr);
130         mergeSort(arr);
131         printArray(arr);
132         
133     }
134 
135 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10944210.html