• 归并排序Java代码实现


    归并排序复习:

    结论:归并排序时间复杂度为O(nlgn),额外空间复杂度为O(n),实现可以做到稳定;

    核心思想:典型的分冶策略思想:

    第一步:拆分:递归对半拆分无序数组为无数的子数组;

    第二步:排序:将子数组排好序;

    第三步:合并:将子数组合并为和原先一样的长度的大数组;排序结束;

    代码实现:

      1 package com.cmbc.test1;
      2 
      3 import java.util.Arrays;
      4 
      5 /**
      6  * 归并排序
      7  * @author itqcy
      8  *
      9  */
     10 public class MergeSortion {
     11     public static void mergeSort(int[] arr){
     12         if(arr==null||arr.length<2){
     13             return;
     14         }
     15         mergeSort(arr,0,arr.length-1);
     16     }
     17 
     18     public static void mergeSort(int[] arr, int l, int r) {
     19         if(l==r){
     20             return;
     21         }
     22         int mid = l+((r-l)>>1);
     23         mergeSort(arr,l,mid);
     24         mergeSort(arr,mid+1,r);
     25         merge(arr,l,mid,r);
     26     }
     27     public static void merge(int[] arr,int l,int mid,int r){
     28         int[] help = new int[r-l+1];
     29         int count = 0;
     30         int p1 = l;
     31         int p2 = mid+1;
     32         while(p1<=mid&&p2<=r){
     33             help[count++] = arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
     34         }
     35         while(p1<=mid){
     36             help[count++] = arr[p1++];
     37         }
     38         while(p2<=r){
     39             help[count++] = arr[p2++];
     40         }
     41         for(int i = 0;i<help.length;i++){
     42             arr[l+i] = help[i];
     43         }
     44     }
     45     
     46     public static void printArray(int[] arr) {
     47         if (arr == null) {
     48             return;
     49         }
     50         for (int i = 0; i < arr.length; i++) {
     51             System.out.print(arr[i] + " ");
     52         }
     53         
     54     }
     55     
     56     public static int[] copyArray(int[] arr) {
     57         if (arr == null) {
     58             return null;
     59         }
     60         int[] res = new int[arr.length];
     61         for (int i = 0; i < arr.length; i++) {
     62             res[i] = arr[i];
     63         }
     64         return res;
     65     }
     66 
     67     public static boolean isEqual(int[] arr1, int[] arr2) {
     68         if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
     69             return false;
     70         }
     71         if (arr1 == null && arr2 == null) {
     72             return true;
     73         }
     74         if (arr1.length != arr2.length) {
     75             return false;
     76         }
     77         for (int i = 0; i < arr1.length; i++) {
     78             if (arr1[i] != arr2[i]) {
     79                 return false;
     80             }
     81         }
     82         return true;
     83     }
     84     
     85     public static int[] generateRandomArray(int maxSize, int maxValue) {
     86         int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
     87         for (int i = 0; i < arr.length; i++) {
     88             arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
     89         }
     90         return arr;
     91     }
     92     
     93     public static void main(String[] args) {
     94         int testTime = 500000;
     95         int maxSize = 100;
     96         int maxValue = 100;
     97         boolean succeed = true;
     98         for (int i = 0; i < testTime; i++) {
     99             int[] arr1 = generateRandomArray(maxSize, maxValue);
    100             int[] arr2 = copyArray(arr1);
    101             mergeSort(arr1);
    102             Arrays.sort(arr2);
    103             if (!isEqual(arr1, arr2)) {
    104                 succeed = false;
    105                 printArray(arr1);
    106                 printArray(arr2);
    107                 break;
    108             }
    109         }
    110         System.out.println(succeed ? "归并排序结果正确!" : "错误!");
    111 
    112         int[] arr = generateRandomArray(maxSize, maxValue);
    113         printArray(arr);
    114         mergeSort(arr);
    115         printArray(arr);
    116     }
    117 }
  • 相关阅读:
    MFC中char*,string和CString之间的转换(待补充)
    Gem/Bundle/Rvm
    Ruby开发入门
    Maven原型骨架及常见问题
    Nginx Upstream模块源码分析(上)
    mysqldump的几个主要选项探究
    探索Antlr(Antlr 3.0更新版)
    Maven2插件开发入门
    说说家乡的互联网-沈阳
    Nginx模块之SessionSticky
  • 原文地址:https://www.cnblogs.com/itqczzz/p/9393159.html
Copyright © 2020-2023  润新知