归并排序
来源:互联网 发布:anyview4.0 java下载 编辑:程序博客网 时间:2024/06/02 07:06
基本概念:
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
基本思想:
运用分治法思想解决排序问题。将两个或两个以上的有序(大小关系)序列组合成一个新的有序序列。 归并排序其实要做两件事: (1)“分解”——将序列每次折半划分。 (2)“合并”——将划分后的序列段两两合并后排序。 在每次合并过程中,都是对两个有序的序列段进行合并,然后排序。 这两个有序序列段分别为 a[left, mid] 和 a[mid+1, right]。 先将他们合并到一个局部的暂存数组b中,带合并完成后再将b复制回R中。 每次比较两个段中的头一个数 ,将较小者放入b中。最后将各段中余下的部分直接复制到b中。 经过这样的过程,b已经是一个有序的序列,再将其复制回a中,一次合并排序就完成了
复杂度分析
最坏情况运行时间:O(nlog2n) 最佳运行时间:O(nlog2n) 归并排序是稳定的
#include<bits/stdc++.h>using namespace std;int b[100010];void add(int a[],int l,int mid,int r,int b[]) //合并{ int i,j,temp=l; i=l; j=mid+1; while(j<=r&&i<=mid) { if(a[i]<=a[j]) b[temp++]=a[i++]; else b[temp++]=a[j++]; } while(i<=mid) b[temp++]=a[i++]; while(j<=r) b[temp++]=a[j++];}void f(int a[],int l,int r,int b[])//分解{ int mid,i; if(r-l==1) { if(a[l]>a[r]) swap(a[l],a[r]); return; } else if(r==l) return; else { mid=(l+r)/2; f(a,l,mid,b); f(a,mid+1,r,b); add(a,l,mid,r,b); for(i=l;i<=r;i++) a[i]=b[i]; }}int main(){ int i,n,a[100010],b[100010]; scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); f(a,1,n,b); for(i=1; i<=n; i++) printf("%d ",a[i]); return 0;}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- oracle正则表达式匹配中文
- springboot第一天 快速启动,json输出
- 微信开发之添加自定义3*5菜单
- 说说JavaScript的原型链
- centos6.5 相关软件安装
- 归并排序
- struts2的属性驱动和模型驱动的区别
- Java并发编程:进程和线程之由来
- java的基本语言元素--注释
- OperationalError: (2005, "Unknown MySQL server host 'localhost' (11001)")
- Spring相关的思维导图等
- 《Spring技术内幕》学习笔记1——IoC容器体系结构
- java try{}catch{}finally{}中catch中存在return,finally运行时间
- 如何快速编写一个汇编软件