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

    一、归并的思想

    考试结束后要将全省的学生成绩进行排名,可以依次将每个班级,每个学校,每个市,每个省的排名合并后再排名就可以得到最终的全省排名,这就用到了归并的思想。

    看看下面这张图,就能很清晰的说明归并的思想了。红色框中就是无序的序列,通过两两合并后再合并,最终获得了一个有序的数组。

    注意观察它的形状,很像一颗倒置的完全二叉树。通常涉及到完全二叉树结构的排序,效率一般都不会低。

    二、算法实现

    归并排序就是利用归并的思想实现的排序方法。它的原理是:

    假设初始序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2的有序子序列(n为奇数时,存在一个长度为1的子序列),再两两归并,如此反复,直至得到一个长度为n的有序序列为止。这种排序方法称为多个2路归并排序排序

    /**
     * 归并排序
     * 
     * 归并排序的思想:
     * 1.两个已排序的数组,可以进行归并将其合并到第三个数组中。
     * 2.借用1中的思想,如果将一个数组分成左右两部分,
     * 
     * @author lp
     *
     */
    public class MergeSort {
    
        public static void mergeSort(int[] data, int left, int right) {
            if (left < right) {
                // 找出中间索引
                int center = (left + right) / 2;
                // 对左边数组进行递归
                mergeSort(data, left, center);
                // 对右边数组进行递归
                mergeSort(data, center + 1, right);
                // 合并
                merge(data, left, center, right);
            }
        }
    
        private static void merge(int[] data, int left, int center, int right) {
            int[] tmpArr = new int[data.length];
            int mid = center + 1;
            // third记录中间数组的索引
            int third = left;
            int tmp = left;
            while (left <= center && mid <= right) {
                // 从两个数组中取出最小的放入中间数组
                if (data[left] <= data[mid]) {
                    tmpArr[third++] = data[left++];
                } else {
                    tmpArr[third++] = data[mid++];
                }
            }
            // 剩余部分依次放入中间数组
            while (mid <= right) {
                tmpArr[third++] = data[mid++];
            }
            while (left <= center) {
                tmpArr[third++] = data[left++];
            }
            // 将中间数组中的内容复制回原数组
            while (tmp <= right) {
                data[tmp] = tmpArr[tmp++];
            }
    
            // System.out.println(Arrays.toString(data));
        }
    
        public static void main(String[] args) {
            int array[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15,35, 25, 53, 51 };
    
            mergeSort(array, 0, array.length - 1);
    
            for (int element : array) {
                System.out.print(element + " ");
            }
        }
    
    }
  • 相关阅读:
    01 《i》控制字体大小 v-for循环绑定类名 v-bind 结合三目运算 动态添加类
    右侧是长方形和半圆结合 光标放上去在规定时间内完成动画
    04-align-content 它对于当单行是没有效果的
    03-flex-wrap是否换行
    02-align-items的用法
    01--顶部的通告特效---仅显示一条一条滚动
    洛谷P2392 kkksc03考前临时抱佛脚(01背包/搜索)
    蓝桥杯 9大臣的旅费(树的直径)
    蓝桥杯 8买不到的数目(数论/线性DP)
    蓝桥杯 7连号区间数(暴力or并查集(?)
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/7503098.html
Copyright © 2011-2022 走看看