算法练习-NOJ-1002-归并排序
来源:互联网 发布:广州哪里学化妆知乎 编辑:程序博客网 时间:2024/05/25 20:01
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定一个数列,用归并排序算法把它排成升序。
输入
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出
输出排序后的数列,每个数字占一行。
输入样例
5
3 2 1 4 5
输出样例
1
2
3
4
5
#include<stdio.h>// 一个递归函数void mergesort(int *num,int start,int end);// 这个函数用来将两个排好序的数组进行合并void merge(int *num,int start,int middle,int end);int main(){ // 测试数组 int num[10000]; int i,n; // 排序之前 scanf("%d",&n); for (i = 0; i < n; i++) { scanf("%d",&num[i]); } // 进行合并排序 mergesort(num,0,n-1); // 排序之后 for (i=0; i<n; i++) { printf("%d\n",num[i]); } return 0;}//这个函数用来将问题细分void mergesort(int *num,int start,int end){ int middle; if(start<end) { middle=(start+end)/2; // 归并的基本思想 // 排左边 mergesort(num,start,middle); // 排右边 mergesort(num,middle+1,end); // 合并 merge(num,start,middle,end); }}//这个函数用于将两个已排好序的子序列合并void merge(int *num,int start,int middle,int end){ int n1=middle-start+1; int n2=end-middle; // 动态分配内存,声明两个数组容纳左右两边的数组 int *L=new int[n1+1]; int *R=new int[n2+1]; int i,j=0,k; //将新建的两个数组赋值 for (i=0; i<n1; i++) { *(L+i)=*(num+start+i); } // 哨兵元素 *(L+n1)=1000000; for (i=0; i<n2; i++) { *(R+i)=*(num+middle+i+1); } *(R+n2)=1000000; i=0; // 进行合并 for (k=start; k<=end; k++) { if(L[i]<=R[j]) { num[k]=L[i]; i++; } else { num[k]=R[j]; j++; } } delete [] L; delete [] R;}
0 0
- 算法练习-NOJ-1002-归并排序
- NOJ 1002归并排序
- 算法练习-归并排序
- 算法练习-NOJ-1003-快速排序
- 练习:归并排序算法实现
- 算法练习-NOJ-1043-跳马
- 算法练习-NOJ-1044-独轮车
- C++编程练习(15)----“排序算法 之 归并排序“
- 排序算法自我练习(四)——归并算法
- 编程练习:归并排序
- Scala练习-归并排序
- 小白算法练习 归并排序 POJ Brainman lanqiao
- 练习《算法导论》之排序:插入排序,归并排序,堆排序,快速排序
- 算法练习-NOJ-1001-二分查找
- 算法练习-NOJ-1004-01背包问题
- 算法练习-NOJ-1005-装载问题
- 算法练习-NOJ-1007-8皇后问题
- 算法练习-NOJ-1046-防卫导弹
- 关于 Android 4.4 系统屏幕旋转调研
- MFC数据库操作 - 获取数据库内容
- 门禁系统
- jsp中setAttribute,getAttribute和getParameter用法
- hdu 2544 最短路(最短路spfa)
- 算法练习-NOJ-1002-归并排序
- 总结
- ThreadLocal深入研究
- 【猫猫的Unity Shader之旅】之反光材质
- 网页上获取MAC地址与计算机名称
- 回调函数
- 算法练习-NOJ-1003-快速排序
- 算法练习-NOJ-1004-01背包问题
- Android RotateAnimation动画参数理解