美文网首页LeetCode
分治算法之归并排序

分治算法之归并排序

作者: 徐凯_xp | 来源:发表于2018-04-28 16:55 被阅读0次

分治算法:
将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同。求出子问题的解后进行合并,就可得到原问题的解。

一般步骤:
1.分解,将要解决的问题划分成若干规模较小的同类问题;
2.求解,当子问题划分得足够小时,用较简单的方法解决;
3.合并,安原问题的要求,将子问题的解逐层合并构成原问题的解。


归并排序复杂度分析

设有n个元素,n个元素归并排序的时
间T(n)
总时间 = 分解时间 + 解决子问题时间 + 合并时间
分解时间: 即对原问题拆解为两个子问 题的时间 复杂度O(n) 解决子问题时间: 即解决两个子问题 的时间 2T(n/2)
合并时间: 即对两个已排序数组归并
的时间 复杂度O(n)
T(n) = 2T(n/2) + 2O(n)
= 2T(n/2) + O(n)
= O(n + 2n/2 + 4n/4 +...+n*1)
= O(nlogn)

详细推导可以参看算法导论

void merge_sort_two_vec(std::vector<int> & sub_vec1,std::vector<int> &sub_vev2, std::vector<int> &sub_vec){
 }

void merge_sort(std::vector<int> & vec){
    if(vec.size() < 2){
        return ;//求解问题足够小时,直接求解
    }
    int mid = vec.size() / 2;
    std::vector<int> sub_vec1;
    std::vector<int> sub_vec2;
    for (int i = 0; i < mid; i++){
      sub_vec1.push_back(vec[i]);
    }
    for(int i =mid ; i < vec.size();i++){
    sub_vec2.push(vec[i]);
    }
    merge_sort(sub_vec1);
    merge_sort(sub_vec2);
    vec.clear();
    merge_sort_two_vec(sub_vec1,sub_vec2,vec);
}
测试
#include <stdio.h>
#include <algorithm>//生成随机数组,利用 std::sort测试归并排序
#include <assert.h>
int main(){
    std::vector<int> vec1;
    std::vector<int> vec2;
    srand(time(NULL));
for(int i = 0;i < 10000;i++){
    int num = (rand() * rand()) % 100003;
    vec1.push_back(num);
    vec2.push_back(num);
  
}
merge_sort(vec1);
std::sort(vec2.begin,vec2.end());
assert(vec1.size() == vec2.size());
for(int i =0;i< vec1.size();i++){
    assert(vec1[i] == vec2[i]);
}
return 0;
}

相关文章

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 数据结构--归并排序

    归并排序 (Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divid...

  • 12 基本排序算法:归并排序

    归并排序 原理 归并排序思想 该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(d...

  • iOS算法系列(5)

    归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer...

  • 2018-03-16

    碰到的算法并查集逆序对归并排序分治算法

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

  • swift经典算法-归并排序

    归并排序 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide...

  • 常用排序算法专题—归并排序

    归并排序 归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide...

  • 常用排序算法专题—归并排序

    归并排序 归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide...

  • 排序算法⑤——归并排序

    归并排序 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide...

网友评论

    本文标题:分治算法之归并排序

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