zoukankan      html  css  js  c++  java
  • 递归分治算法(一)-归并排序算法

    前言:

    分治法是一种算法设计思想,所谓分治,意为分而治之,是指将一个难以直接解决的大问题,递归的分割成一些规模的较小的问题,以便逐个解决。采用分治法设计的算法通常用到递归算法来实现,故标题为递归分治。

    归并排序算法

    归并就是将两个或两个以上的有序表合并成一个新的有序表。归并排序就是将无序的待排序的序列分解成若干个有序的子序列,并把有序子序列合并为整体有序序列的过程。一般分为2-路归并排序和多路归并排序。

    他的大概流程如下图:

    我们来看看java代码怎么写的:

    package guibing;
    
    /***
     * @author 文聪
     * @date 2016/9/26
     *  归并排序算法
     **/
    public class Sort {
        public static void main(String[] args) {
            int[] a = {42,30,68,98,86,15,57};
            sort(a, 0, a.length-1);
            for (int i : a) {
                System.out.print(i+" ");
            }
    }
    
        public static void sort(int[] a, int left, int right) {
            if (left >= right)
                return;
    
            int center = (left + right) >> 1;
            sort(a, left, center);
            sort(a, center + 1, right);
            merge(a, left, center, right);
    }
    
        public static void merge(int[] data, int left, int center, int right) {
            int[] tmpArr = new int[right+1];
            int mid = center + 1;
            int index = left; // index记录临时数组的索引
            int tmp = left;
    
            // 从两个数组中取出最小的放入中临时数组
            while (left <= center && mid <= right) {
                tmpArr[index++] = (data[left] <= data[mid]) ? data[left++]: data[mid++];
            }
            // 剩余部分依次放入临时数组
            while (mid <= right) {
                tmpArr[index++] = data[mid++];
            }
            while (left <= center) {
                tmpArr[index++] = data[left++];
            }
            // 将临时数组中的内容复制回原数组
            for (int i = tmp; i <= right; i++) {
                data[i] = tmpArr[i];
            }
    }
    }

    总结:对归并排序算法进行分析发现,每一层归并排序都是将区间[left,right]划分为两个大致相等的子序列,然后进行归并。排序过程需要进行[logn]层的递归分解和归并,由此的归并排序的算法时间复杂度为O(nlogn),空间复杂度也为O(n)

    QQ交流群:494389786 个人网站:www.fanwencong.com
  • 相关阅读:
    39门课程。加油!学长只能帮你到这里了!
    联邦企业架构之CIO委员会的企业架构实施指南(上)
    RTEMS 进程切换分析
    styleCop使用介绍和Fxcop使用参考
    获得Web目录URL
    HelloWorld demo
    第一个C语言程序
    文件分布式存储方案
    Linux常用指令别名、输入/输出重定向、管道、命令连接符、命令替换符
    JavaEE项目问题总结
  • 原文地址:https://www.cnblogs.com/fanwencong/p/5910503.html
Copyright © 2011-2022 走看看