zoukankan      html  css  js  c++  java
  • 几种排序之归并排序

    还是这个老哥写的好: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 }
  • 相关阅读:
    spring的常用配置
    aop切入点表达式
    代理模式
    hibernate的常用配置
    正则表达式
    Java配置
    性能提升
    创建vue3 项目
    manjaro
    单调队列
  • 原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10944210.html
Copyright © 2011-2022 走看看