归并排序是效率很好的排序方式,和快排效率一样高,但在稳定性上优于快排,下面我们来介绍归并排序。

归并排序运用递归将序列不断二分(其原理就是分治),就像一棵树不断向下分支,最后分到只剩一个元素,这样这个元素就可当做有序的,因为只有一个元素嘛。然后是合并,怎么分出来就怎么合并回去,不过既然是排序,那么合并的时候就需要比较一下大小了。

下面为了更好的理解,我们来看一张图片。(这张图是借用的,很感谢制图人)

这就是一个简单序列的归并排序过程。

下面让我们来看代码。

#include<cstdio>
const int Max=50001;
int temp[Max],num=0;
void mergearray(int a[],int first,int mid,int last){//将数组按顺序合并
int i=first,j=mid+1,m=mid,n=last,k=0;
while(i<=m&&j<=n){//这里的等号很重要,没有的话前半段的数据不能全部遍历
if(a[i]<=a[j]) temp[k++]=a[i++];
else{
temp[k++]=a[j++];
num+=mid-i+1; //统计逆序数对
}
}
while(i<=m) temp[k++]=a[i++];    //这里等号很重要,不然会漏数据
while(j<=n) temp[k++]=a[j++];//这里等号很重要,不然会漏数据
for(int q=0;q<=last-first;q++)
a[first+q]=temp[q];
} void mergesort(int a[],int first,int last){//将数组二分处理
if(first<last){
int mid=(first+last)/2;
mergesort(a,first,mid); //左边有序
mergesort(a,mid+1,last);//右边有序
mergearray(a,first,mid,last);
}
}
int main()
{
int a[Max],n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
mergesort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d\n",a[i]);//统计逆序数的话输出num即可。
}

这里可能有的人不太明白逆序数为什么num+=mid-i+1这样算,这里做一下说明,在数组合并时计算前面的数是否比后面的大,这里要注意合并时前后两部分已经是有序,如果此时啊a[i]>a[j],说明a[first]到a[i-1]全部小于a[j],而a[mid+1]到a[j-1]全部小于a[j],那么意思就是大于a[j]的数全部在a[i]到a[mid]之间,a[i]到a[mid]共有mid-i+1个数,所以逆序数对num此时要加上mid-i+1。

本人实力有限,如有错误,欢迎指出,谢谢。

最新文章

  1. 一个完整的TCP连接
  2. compare
  3. uploadify firefox 401
  4. Objective-C语言Foundation框架
  5. 修改shell 将当前shell(默认是bash B SHELL )改为csh C SHELL
  6. javaweb学习总结二十二(servlet开发中常见的问题汇总)
  7. SQL通过xml插入批量数据
  8. WPF(布局)
  9. ps -aux中的time 的意思
  10. Bootstrap3.0学习第三轮(栅格系统案例)
  11. Eclipse-ee 启动Tomcat后浏览器无法访问Tomat,并且Web项目服务部署
  12. Docker 网络管理及容器跨主机通信
  13. PHP查看本地文件夹及删除文件夹操作
  14. Java并发编程之并发容器
  15. 高级定时器TIM1&amp;TIM8
  16. 2018上C语言程序设计(高级)作业- 第4次作业
  17. 实习第一天:static 声明的 变量和 方法
  18. tyvj1305 最大子序和 【单调队列优化dp】
  19. 温故而知新 js 的错误处理机制
  20. django drf 初探serializer

热门文章

  1. [noip2014]P2312 解方程
  2. JMeter学习-图形化 HTML 报表概要说明
  3. Why Helm?【转】
  4. springCloud 之 Eureka注册中心高可用配置
  5. SQL语句利用日志写shell拿权限
  6. 微信小程序自定义组件-下拉框
  7. 杭电oj1860:统计字符(字符串hash / 水题)
  8. ThinkPHP 3.1 自定义标签
  9. Golang的基础数据类型-布尔型
  10. 英语语法 - the + 形容词 的意义