内部排序:归并排序

基本思想:将序列不断的平衡划分,直到最小粒度上(仅有一个元素),不断向上在划分间归并得到排序元素。

时间复杂度:O(nlogn) 解释每一层递归都执行n/2次比较(所有的两辆划分间),递归深度为logn

关于递归

1、犯了一个错误:mid = (end + start) / 2 mid = (end - start) / 2 + start

2、继续划分的条件:start < end

3、需要保持一个n的辅助数组,将归并的中间数据copy到辅助数组中,因为在执行归并是两个归并段是不能变的,归并完成后在写回到array中上递归。

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4.  
  5. public class Sorter {
  6.  
  7.  
  8.    public static void main(String[] args) {
  9.  
  10.       BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  11.       int[] array;
  12.       int[] result;
  13.       try {
  14.          String[] nums = input.readLine().split("");
  15.          array = new int[nums.length];
  16.          result = new int[nums.length];
  17.          for (int i = 0; i < nums.length; i++) {
  18.             array[i] = Integer.parseInt(nums[i]);
  19.          }
  20.          merge(array, result, 0, nums.length - 1);
  21.  
  22.          for (int elem : result) {
  23.             System.out.print(elem + "");
  24.          }
  25.  
  26.  
  27.       } catch (Exception e) {
  28.          // TODO Auto-generated catch block
  29.          e.printStackTrace();
  30.       }
  31.    }
  32.  
  33.    public static void merge(int[] array, int[] result, int start, int end) {
  34.  
  35.          int mid = (end + start) / 2;
  36.  
  37.          System.out.println(start + "" + mid + "" + end);
  38.  
  39.          if (start < mid)
  40.             merge(array, result, start, mid);
  41.  
  42.          if (mid + 1 < end)
  43.             merge(array, result, mid + 1, end);
  44.  
  45.          int p1 = start, p2 = mid + 1, counter = start;
  46.          while (p1 <= mid && p2 <= end) {
  47.             if (array[p1] < array[p2]) {
  48.                result[counter] = array[p1++];
  49.             } else {
  50.                result[counter] = array[p2++];
  51.             }
  52.  
  53.             counter++;
  54.          }
  55.  
  56.          while (p1 <= mid) {
  57.             result[counter++] = array[p1++];
  58.          }
  59.  
  60.          while (p2 <= end) {
  61.             result[counter++] = array[p2++];
  62.          }
  63.  
  64.          for (int i = start; i <= end; i++) {
  65.             array[i] = result[i];
  66.          }
  67.    }
  68. }
原文地址:https://www.cnblogs.com/zjgtan/p/3341498.html