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

    定义:

    和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。
    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
    排序思想:

    把长度为n的输入序列分成两个长度为n/2的子序列;

    对这两个子序列分别采用归并排序;

    将两个排序好的子序列合并成一个最终的排序序列。

    动图演示

    代码演示:

    void merge(int *array, int L, int M, int R)
    {
        int left_size = M - L;
        int right_size = R - M + 1;    
        int *left =  new int[left_size];
        int *right = new int[right_size];
        int i, j, k;
        for (i = L; i < M; i++)
            left[i-L] = array[i];
        for (i = M; i <= R; i++)
            right[i - M] = array[i];
        i = 0, j = 0, k = L;
        while (i < left_size && j < right_size)
        {
            if (left[i]>=right[j])
                array[k++] = right[j++];
            else
                array[k++] = left[i++];    
        }
        while (i < left_size)
            array[k++] = left[i++];
    
        while (j < right_size)
            array[k++] = right[j++];    
    }
    
    void merge_sort(int *array, int L, int R)
    {
        if (L == R) return;
        else
        {
            int M = (L + R) / 2;
            merge_sort(array, L, M);
            merge_sort(array, M + 1, R);
            merge(array, L, M + 1, R);
        }
    }
  • 相关阅读:
    以最简单的方式讲HashMap
    Python获得百度统计API的数据并发送邮件
    Java反射,注解,以及动态代理
    LeetCode每天一题之两数之和
    记一次SSM项目小结(一)
    OpenStack配置串口显示虚机界面
    sqlalchemy外键和relationship查询
    sqlalchemy数据库分层操作
    数据库外键基础知识和操作(世界杯版)
    openstack ovs实现vlan组网
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10893044.html
Copyright © 2011-2022 走看看