归并排序
2016-03-28 19:05
274 查看
#include <stdio.h> #include <stdlib.h> int s[1000000],r[1000000]; void merge(int s[],int f,int m,int n,int r[]) //将s中相邻两个子文件合并至r中相同位置 { int i=f,j=m+1,k=f; while(i<m+1&&j<n+1) { if(s[j]<s[i]) { r[k]=s[j]; ++j; } else { r[k]=s[i]; ++i; } ++k; } for(; i<m+1; ++i,++k) r[k]=s[i]; for(; j<n+1; ++j,++k) r[k]=s[j]; } void mpass(int s[],int n,int len,int r[])//一趟合并 { int i=0,j=i+len; while(j+len-1<n) { merge(s,i,j-1,j-1+len,r); i+=2*len; j=i+len; } if(j<n) merge(s,i,j-1,n-1,r); else { while(i<n) { r[i]=s[i]; ++i; } } } void msort(int s[],int n)//归并排序 { int len=1; while(len<n) { mpass(s,n,len,r); len*=2; mpass(r,n,len,s); len*=2; } } int main() { freopen("data1m.txt","r",stdin); freopen("out.txt","w",stdout); int n; scanf("%d\n",&n); int i; for(i=0; i<n; i++) scanf("%d\n",&s[i]); msort(s,n); for(i=0; i<n; i++) printf("%d\n",s[i]); return 0; }
相关文章推荐
- 数组名和数组名取地址的区别
- Linux命令之VIM编辑器
- 创建高可用Apache服务
- 第四周项目1—三角形类雏形
- 自定义View 绘画,Sharder 瓦片模式
- 进度
- 【java基础概念】(2016/3/28)
- Linux学习笔记1
- mac上同时安装多个jdk,选择版本
- JavaScript之基础-16 JavaScript 原型与继承
- 最短路径算法
- [译]Android高级技巧: Renderscript优化模糊效果
- hdu2028(母函数)
- List,Set,Map
- JAVA中关于DATE时间日期加减、String与Date类型的转换
- 【Chromium中文文档】进程模型
- 彻底弄懂最短路径问题[转]
- 嵌入式Linux编译器gcc使用
- 创建RHCS集群环境
- JavaWeb测试题总结