归并排序(分治法+简洁易懂)

来源:互联网 发布:淘宝上显示喵喵折 编辑:程序博客网 时间: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