分治算法之归并排序
时间:2022-06-08
本文章向大家介绍分治算法之归并排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分治算法: 将一个规模为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;
}
- Golang 语言--linux 下 go语言 vim设置
- 南阳OJ----Binary String Matching
- Golang RSA加密解密程序
- HDUOJ--汉诺塔II
- Golang语言-操作json,注意json的嵌套、数组
- Java随机数算法(一)(r11笔记第14天)
- 【翻译】Golang语言-是面向对象语言吗?
- 一些Golang小技巧
- 数据载入过慢?这里有一份TensorFlow加速指南
- 转--如何压缩Golang 编译出的可执行文件大小
- 转-Golang语言-- Test Case
- 最小公倍数
- 十条有用的 Golang语言 技术
- 闪回区报警引发的性能问题分析(r11笔记第11天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法