美文网首页
归并排序 --- Java版

归并排序 --- Java版

作者: Skymiles | 来源:发表于2020-03-01 15:21 被阅读0次

算法思路

mergeSort.jpg
  1. 把待排序List中间切分成2段,而且是递归切分,直到子List元素只有1个结束。
  2. 把切分好的子List,进行按照大小进行排序merge,合成一个List。
  3. 重复这个过程,直到形成一个完整的排序好的List。

算法实现

class TestClass {
    public static void main(String args[] ) throws Exception {
        /* Sample code to perform I/O:
         * Use either of these methods for input

        //BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String name = br.readLine();                // Reading input from STDIN
        System.out.println("Hi, " + name + ".");    // Writing output to STDOUT

        //Scanner
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();                 // Reading input from STDIN
        System.out.println("Hi, " + name + ".");    // Writing output to STDOUT

        */

        // Write your code here
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();                 // Reading input from STDIN
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = s.nextInt();
        }
        
        mergeSort(a, 0, n - 1);
        for (int i = 0; i < n; i++) {
            System.out.printf("%d ", a[i]);
        }
    }
    
    private static void mergeSort(int[] a, int low, int high) {
        if (low >= high) {
            return;
        }
        
        int mid = low + (high - low) / 2;
        mergeSort(a, low, mid);
        mergeSort(a, mid + 1, high);
        
        merge(a, low, mid, high);
    }
    
   private static void merge(int[] a, int low, int mid, int high) {

        int[] nums = new int[high - low + 1];
        // 合并的第一个数组起始位置p
        // 合并的第二个数组起始位置q
        int p = low, q = mid + 1;
        int index = 0;
        while (p <= mid && q <= high) {
            if (a[p] < a[q]) {
                nums[index++] = a[p++];
            } else {
                nums[index++] = a[q++];
            }
        }

        while (p <= mid) {
            nums[index++] = a[p++];
        }

        while (q <= high) {
            nums[index++] = a[q++];
        }

        System.arraycopy(nums, 0, a, low, high - low + 1);
    }

相关文章

  • 归并排序

    归并排序Java实现

  • 归并排序

    归并排序 代码实现(java):

  • 归并排序(Java版)

    归并排序:当数组只有四个元素的时候可以这样定义归并排序,将数组平均分成两半,分别是左区间和右区间,将左区间、右区间...

  • 归并排序 --- Java版

    算法思路 把待排序List中间切分成2段,而且是递归切分,直到子List元素只有1个结束。 把切分好的子List,...

  • 常用排序算法的Java实现

    冒泡、插入、选择、归并、快速排序的Java实现

  • 归并排序

    自顶向下的归并排序 java描述

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • Java代码实现归并排序

    Java代码实现归并排序 归并排序(Merge Sort) 思路:如果要排序一个数组,我们先把数组从中间分成前后两...

  • 快排 、 归并排序----复习

    分治思想在归并排序之中可以很好地体现出来。 归并排序: 下面是程序java static public void...

  • 多线程归并排序 go实现

    特性 线程数可以调整 混合使用归并排序的递归版和非递归版实现减少递归调用损耗 线程利用率高 不足:归并排序的mer...

网友评论

      本文标题:归并排序 --- Java版

      本文链接:https://www.haomeiwen.com/subject/exqckhtx.html