归并排序,递归和非递归实现

简介: 归并排序,递归和非递归实现
package com.harrison.class03;
public class Code01_MergeSort {
  public static void mergeSort1(int[] arr) {
    if (arr == null || arr.length < 2) {
      return;
    }
    process(arr, 0, arr.length - 1);
  }
  public static void process(int[] arr, int L, int R) {
    if (L == R) {
      return;
    }
    int mid = L + ((R - L) >> 1);
    process(arr, L, mid);
    process(arr, mid + 1, R);
    merge(arr, L, mid, R);
  }
  public static void merge(int[] arr, int L, int M, int R) {
    int[] help = new int[R - L + 1];
    int i = 0;
    int p1 = L;
    int p2 = M + 1;
    while (p1 <= M && p2 <= R) {
      help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
    }
    while (p1 <= M) {
      help[i++] = arr[p1++];
    }
    while (p2 <= R) {
      help[i++] = arr[p2++];
    }
    for (i = 0; i < help.length; i++) {
      arr[L+i] = help[i];
    }
  }
  public static void mergeSort2(int[] arr) {
    if (arr == null || arr.length < 2) {
      return;
    }
    int N=arr.length;
    int mergeSize=1;
    while(mergeSize<N) {
      int L=0;
      while(L<N) {
        int M=L+mergeSize-1;
        if(M>=N) {
          break;
        }
        int R=Math.min(M+mergeSize, N-1);
        merge(arr, L, M, R);
        L=R+1;
      }
      if(mergeSize>N/2) {
        break;
      }
      mergeSize<<=1;
    }
  }
  public static int[] generateRandomArray(int maxSize, int maxValue) {
    int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
    for (int i = 0; i < arr.length; i++) {
      arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
    }
    return arr;
  }
  public static int[] copyArray(int[] arr) {
    if (arr == null) {
      return null;
    }
    int[] res = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
      res[i] = arr[i];
    }
    return res;
  }
  public static boolean isEqual(int[] arr1, int[] arr2) {
    if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
      return false;
    }
    if (arr1 == null && arr2 == null) {
      return true;
    }
    if (arr1.length != arr2.length) {
      return false;
    }
    for (int i = 0; i < arr1.length; i++) {
      if (arr1[i] != arr2[i]) {
        return false;
      }
    }
    return true;
  }
  public static void printArray(int[] arr) {
    if (arr == null) {
      return;
    }
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
    System.out.println();
  }
  public static void main(String[] args) {
    int testTimes=1000000;
    int maxSize=100;
    int maxValue=100;
    System.out.println("test begin");
    for(int i=0; i<testTimes; i++) {
      int[] arr1=generateRandomArray(maxSize, maxValue);
      int[] arr2=copyArray(arr1);
      mergeSort1(arr1);
      mergeSort2(arr2);
      if(!isEqual(arr1, arr2)) {
        System.out.println("Oops"); 
        printArray(arr1);
        printArray(arr2);
        break;
      }
    }
    System.out.println("finish");
  }
}
相关文章
归并排序及其非递归实现
归并排序及其非递归实现
39 0
|
7月前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
98 2
|
7月前
|
搜索推荐 C++
【非递归版】归并排序算法(2)
【非递归版】归并排序算法(2)
56 0
|
7月前
|
存储 搜索推荐
【非递归版】快速排序算法(4)
【非递归版】快速排序算法(4)
47 0
|
7月前
|
搜索推荐 算法 C++
【递归版】归并排序算法(1)
【递归版】归并排序算法(1)
52 0
|
7月前
|
搜索推荐 算法
排序算法——归并排序(递归与非递归)
排序算法——归并排序(递归与非递归)
|
7月前
|
搜索推荐 算法
排序算法:归并排序(递归和非递归)
排序算法:归并排序(递归和非递归)
74 0
|
算法 搜索推荐
归并排序含非递归版
归并排序含非递归版
|
搜索推荐 算法
归并排序(递归+非递归)
归并排序(递归+非递归)
|
存储
快速排序(非递归)
快速排序(非递归)
127 0