归并排序的实现
2015-07-29 14:53
344 查看
归并排序
算法导论第二章就着重介绍的归并排序,充分体现了分治法的思想,同时也利用了递归。也是类比生活中洗牌的场景,十分生动形象。具体代码:
void merge(int a[],int p ,int q,int r) { int i=0,j=0,k; //左右新数组 int *LeftArray; int *RightArray; //左右数组大小 int size_left ,size_right; size_left = q-p+1; size_right = r-q; //分配左右数组空间 LeftArray = (int*)malloc(sizeof(int)*size_left); RightArray = (int*)malloc(sizeof(int)*size_right); //分别复制a数组左右两边 for (i = 0;i < size_left ; i++) { LeftArray[i] = a[p+i]; } for (j = 0;j < size_right ; j++) { RightArray[j] = a[q+j+1]; } //memcpy(LeftArray,a,sizeof(size_left)); //memcpy(RightArray,a+q,sizeof(size_right)); i=0;j=0; for(k=p;k<=r;k++) { if(i<size_left && j<size_right) { if(LeftArray[i] <= RightArray[j]) { a[k] = LeftArray[i]; i++; } else if( j < size_right) { a[k] = RightArray[j]; j++; } } else if(i < size_left) { a[k] = LeftArray[i]; i++; } else if( j < size_right) { a[k] = RightArray[j]; j++; } } //回收申请的堆内存 free(LeftArray); LeftArray = NULL; free(RightArray); RightArray = NULL; } void merge_sort(int a[],int p ,int r) { int mid; if(p<r) { mid = (p+r)>>1; merge_sort(a,p,mid); merge_sort(a,mid+1,r); merge(a,p,mid,r); } }
测试代码:
运行结果:
相关文章推荐
- Redis学习2_在学习Redis过程中,遇到的问题汇总
- mov 和 mp4 格式的区别
- ffmpeg封装PCM到MP4
- win7下使用共享内存方式CreateFileMapping返回GetLastError总是0x5的问题解决
- 51cto十周年征文:我的技术我做主
- 华为是怎样研发的(18)——质量回溯
- 罗马数字转换成整数
- ExtJS4.2 cellclick获取单元格内容
- js中event.keyCode用法及keyCode对照表
- ListView中嵌套ViewPager事件冲突问题
- 多校3 1010 Crazy Bobo
- 基于Unity5.0系统的新打包方式
- 基于汉王云API的人脸识别
- 【结构体排序】hdu 2409 Team Arrangement
- js的压缩与混淆
- Thrift初试。
- 重新定义超频 解读NVIDIA的Shader频率
- vector的一些操作
- Highcharts前端报表
- 设计模式(3):抽象工厂模式