归并排序
2016-04-05 16:47
253 查看
基本思想:
给出一个数组,将数组二分为两个子数组,一直二分到子数组中只有一个数为止,然后将子数组合并,每次合并时,都是将连个排好序的子数组合并;
给出一个数组,将数组二分为两个子数组,一直二分到子数组中只有一个数为止,然后将子数组合并,每次合并时,都是将连个排好序的子数组合并;
#include<stdio.h> void que(int a[10000],int first,int mid,int last,int tem[10000]) //将两个排好序的子区间合并 { int i=first,j=mid+1; //i,j 是两个子区间的开头 int m=mid,n=last; //n,m是两个子区间的结束 int k=0; //k为备用数组的开头; while(i<=m&&j<=n) //如果两个区间都有数; { if(a[i]<=a[j]) { tem[k++]=a[i++]; } else { tem[k++]=a[j++]; } } while(i<=m) //将剩下的一个区间的数加到备用数组尾部 { tem[k++]=a[i++]; } while(j<=n) { tem[k++]=a[j++]; } for(i=0;i<k;i++) { a[first+i]=tem[i]; //将排好序的数重新还给a数组; } } void qu(int a[10000],int first,int last,int tem[10000]) //将一个区间二分为两个子区间 { if(first<last) //一直分到区间中只有一个数 即last=first { int mid; mid=(first+last)/2; qu(a,first,mid,tem); //继续将左右区间二分 qu(a,mid+1,last,tem); que(a,first,mid,last,tem); //将两个排好序的区间合并; } } int main() { int a[10000],i,n,tem[10000]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } qu(a,0,n-1,tem); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); } }
相关文章推荐
- dedecms 标签
- 哪错的排序
- Cordova插件,自动根据包名替换R资源描述
- swift 类似九宫格
- math3.util.ArithmeticUtils
- POJ 1077 Eight(八数码A*+IDA*)
- Android 全局异常捕获的完整实践
- Codeforces Round #247(Div. 2) C. k-Tree DP
- jquery1.6中的.prop()和.attr()异同
- pojsupermark
- 基本快速排序
- UNICODE,GBK,UTF-8区别
- 新手提问,按F12那个控制台(?)在右边,怎么设置在下边?
- Java开发中的23种设计模式详解
- 构建之法——第四章读后感
- 如何将中缀式转化成前缀式和后缀式
- maven加载本地库
- springMVC+uploadify3.1 文件上传 demo
- Probe监控Tomcat
- 由外向内生成N*N矩阵