[笔记]:归并排序
来源:互联网 发布:opencv 匹配优化 编辑:程序博客网 时间:2024/06/09 18:40
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
中文名 归并排序
外文名 Merge sort
稳定性 稳定
时间复杂度 O(n log n)
空间复杂度 O(n)
发明者 约翰·冯·诺伊曼
#include<bits/stdc++.h>#define N 1000using namespace std;int a[50]={2,9,5,8,7,1,14,9,10,6};void manage(int l,int m,int r)//归并排序分为分和合并两个过程{ int b[N]={0},k=l; int i=l,j=m+1; while(k<=r){ if(i<=m&&j<=r){ if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++];} if(i>m&&j<=r) b[k++]=a[j++]; else if(i<=m&&j>r) b[k++]=a[i++]; } for(int i=l;i<=r;i++){ a[i]=b[i]; }}void fen(int l,int r){//分 将一个数组分为很多小数组 直到小数组只有两个元素比较 再合并 if(l<r){ int m=(l+r)/2; fen(l,m);//左边一个部分 fen(m+1,r);//右边一个部分 manage(l,m,r);//合并 }}int main(){ fen(0,9); for(int i=0;i<=9;i++) cout<<a[i]<<" "; return 0;}
阅读全文
0 0
- 算法笔记--归并排序
- 归并排序学习笔记
- 归并排序算法笔记
- 学习笔记-归并排序
- [笔记]:归并排序
- 【笔记】归并排序
- 算法学习笔记----归并排序
- 算法笔记之归并排序
- 归并排序算法学习笔记
- 算法笔记三:归并排序
- 自学笔记之归并排序
- 算法学习笔记--归并排序
- 归并排序-归并排序
- 笔记1--逆序对(归并排序)
- 算法笔记2——归并排序
- 基础算法学习笔记—归并排序
- 算法导论笔记——归并排序
- 归并排序-《算法导论》学习笔记二
- Java VisualVM插件地址
- 切图小技巧
- Java中对象的序列化和反序列化
- Ali Java 开发手册摘录
- 二叉树的递归建立
- [笔记]:归并排序
- 三种近距离技术ZigBee、蓝牙(Bluetooth)和WiFi介绍
- 实现一个简单的通讯录
- CSS Modules
- JavaScript之函数绑定与函数柯里化(高级函数)
- C++ 类的继承与派生
- 【mysql】mycat实现mysql读写分离
- POJ 1199 Left labyrinths 笔记
- Angular传多个值到controller