归并排序(分治法+简洁易懂)
来源:互联网 发布:淘宝上显示喵喵折 编辑:程序博客网 时间:2024/05/16 12:09
归并排序是一种高效的排序算法(时间复杂度(O(nlogn))),按照分治三步法,对归并排序算法介绍如下:
划分问题: 把序列分成元素个数尽量相等的两半
递归求解:把两半元素分别排序。
合并问题:把两个有序表合并成一个
(我之前看都没有看过归并排序这么简洁的代码,包括在书上)
归并好处:高效(思想也很重要)
缺点:需要辅助存储空间。
#include"stdio.h"#include"stdlib.h"#include"algorithm"#include"math.h"using namespace std;const int maxn=50005;int data[maxn]; int tmp[maxn];int cnt=0;void merge_sort(int data[],int left,int right,int tmp[]) // 闭合区间[left,right] { if(right>left) //至少有一个元素{int m=left+(right-left)/2; //划分merge_sort(data,left,m,tmp); //递归求解 merge_sort(data,m+1,right,tmp);//递归求解int le=left,ri=m+1;int i=left;while(le<=m||ri<=right) //合并求解 {if(ri>right||(le<=m)&&(data[le]<data[ri])) //从左半区间复制到临时空间 tmp[i++]=data[le++]; else { tmp[i++]=data[ri++]; //从右半区间复制到临时空间 cnt+=m-le+1; //记录逆序对 } } for(int i=left;i<=right;i++) data[i]=tmp[i]; //从辅助空间复制到data }}int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&data[i]);merge_sort(data,0,n-1,tmp);for(int i=0;i<n;i++) printf("%d ",data[i]); printf("%d\n",cnt);return 0;}
上面代码除了归并排序之外,还增加了求逆序对,这便是归并排序的直接应用了。
1 0
- 归并排序(分治法+简洁易懂)
- 分治法(归并排序)
- 归并排序(分治法)
- 归并排序(分治法)
- 分治法,归并排序
- 分治法-归并排序
- 分治法-归并排序
- 归并排序-分治法
- 分治法 - 归并排序
- 分治法--归并排序
- 归并排序 分治法
- 归并排序--分治法
- 分治法 & 归并排序
- 分治法-归并排序
- 分治法-归并排序
- 分治法-归并排序
- 分治(归并排序)
- 归并排序(分治)
- 51Nod 1065 最小正子段和(归并 贪心,好题)
- 你所不知道的程序猿博客
- 测试·主打单元测试
- Qt:简单的记事本小软件
- 相册获取照片时,同时获取照片名称
- 归并排序(分治法+简洁易懂)
- codesign的一些理解
- 19. Remove Nth Node From End of List
- JetBrains Cracker
- Ant Colony Algorithm
- [first order method] Proximal Gradient Descent
- Amazon面经2016/2
- 使用Eclipse进行git分支切换
- 6. ZigZag Conversion