zoukankan      html  css  js  c++  java
  • 内部排序:归并排序

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

    时间复杂度: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. }
  • 相关阅读:
    如何理解cat的输入输出重定向
    Vagrant网络设置
    Vagrant入门
    设计模式的原则
    单例模式
    LRU 实现缓存
    java注解
    java8---lambda表达式
    JUC--Callable 以及Lock同步锁
    JUC--闭锁 CountDownLatch
  • 原文地址:https://www.cnblogs.com/zjgtan/p/3341498.html
Copyright © 2011-2022 走看看