归并排序

简介
归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

复杂度

代码

 /**
   * 合并
   * @param arr 操作的数组
   * @param left   左边有序序列的初始索引
   * @param mid 中间索引
   * @param right 右边索引
   * @param temp  中间存储数据的数组
   */
  public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
    int i = left;
    int j = mid + 1;
    int t = 0;
    while (i <= mid && j <= right) {
      if (arr[i] <= arr[j]) {
        temp[t] = arr[i];
        i += 1;
      } else {
        temp[t] = arr[j];
        j += 1;
      }
      t += 1;
    }
    while (i <= mid) {
      temp[t] = arr[i];
      i += 1;
      t += 1;
    }
    while (j <= right) {
      temp[t] = arr[j];
      j += 1;
      t += 1;
    }
    t = 0;
    int tempLeft = left;
    while (tempLeft <= right) {
      arr[tempLeft] = temp[t];
      t += 1;
      tempLeft += 1;
    }
  }
  public static void mergeSort(int[] arr, int left, int right, int[] temp) {
    if (left < right) {
      int mid = (left + right) / 2;
      mergeSort(arr,left,mid,temp);
      mergeSort(arr,mid + 1, right,temp);
      merge(arr,left,mid,right,temp);
    }
  }

测试

    int[] arr = { 8, 5, 7, 4, 1, 6, 3, 2 };
    int[] temp = new int[arr.length];
    mergeSort(arr,0,arr.length - 1,temp);
    System.out.println(Arrays.toString(arr));

posted @ 2021-08-10 16:23  翻蹄亮掌一皮鞋  阅读(38)  评论(0)    收藏  举报