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 + " ");
            }
        }
    
    }
  • 相关阅读:
    多测师肖老师_git版本控制器之使用(3.2.3)
    多测师肖老师_linux之yum源解决方法(2.3)
    快速排序c++实现
    算法复杂性表示
    lua学习测试脚本
    获取程序当前文件夹 c#
    C#读写注册表 二进制写入
    [转]c# Config修改
    C# 文件版本信息读取
    lua中的table
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/7503098.html
Copyright © 2011-2022 走看看