归并排序
2016-07-23 21:18
288 查看
归并排序用到了分治策略。
用分治策略解决问题分为三步:分解、解决、合并。也即:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,得到原问题的解。此处n=2
用分治策略解决问题分为三步:分解、解决、合并。也即:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,得到原问题的解。此处n=2
归并排序的伪代码
合并排序伪代码(使用哨兵):merge(A,p,q,r): n1 <—— q-p+1 n2 <—— r-q create array L[0,n1] and R[0,n2] for i <—— 0 to n1-1 do L[i] <—— A[p+i] for j <—— 0 to n2-1 do R[j] <—— A[q+j+1] L[n1] <—— +∞ R[n2] <—— +∞ i <—— 0 j <—— 0 for k i <—— p to r do if L[i]<=R[j] then A[k] <—— L[i] i <—— i+1 else A[k] <—— R[j] j <—— j+1 //通过调用merge完成排序: merge_sort(A,p,r): if p<r then q <—— [(p+r)/2] //向下取整 merge_sort(A,p,q) //分治 merge_sort(A,q+1,r) merge(A,p,q,r) //合并结果
归并排序实现
一个简单的实现(有待优化)#include <stdio.h> #include <stdlib.h> #define MAX_INT ~(1<<31)//最大整数 //arr[p,q] arr[q+1,r] void merge(int *arr,int p,int q,int r) { if(arr==NULL) return; int n1=q-p+1; int n2=r-q; int *L=(int*)malloc((n1+1)*sizeof(int)); int *R=(int*)malloc((n2+1)*sizeof(int)); int i,j; for(i=0;i<n1;++i) L[i]=arr[p+i]; for(j=0;j<n2;++j) R[j]=arr[q+j+1]; //哨兵元素赋值 L[n1]=MAX_INT; R[n2]=MAX_INT; int k; i=0,j=0; for(k=p;k<=r;++k){ if(L[i]<=R[j]) arr[k]=L[i++]; else arr[k]=R[j++]; } free(L); free(R); } void merge_sort(int *arr,int p,int r) { if(p<r){ int q=(r+p)/2; merge_sort(arr,p,q);//分治 merge_sort(arr,q+1,r); merge(arr,p,q,r);//合并结果 } } int main() { int arr[8]={32,3,4,5,6,7,9,106}; merge_sort(arr,0,7); for (int i=0;i<8;i++) { printf("%d ",arr[i]); } system("pause"); }
相关文章推荐
- Linux系统用户与用户组管理
- linux 使用qq 这个qq2015更新的
- 8086汇编语言自学经验分享 db,dw,dd的实例
- ubuntu14.04LTS 安装后几个基本设置
- 企业大数据平台三:企业大数据平台安装
- smarty变量
- Android-下拉刷新(一)自定义刷新视图
- 博弈论(二):Sprague-Grundy函数
- 企业大数据平台二:企业大数据平台环境准备
- HDU 1872 稳定排序
- PHP file_get_content在远程通信之前的准备,服务器中json_decode解析详解
- nginx 默认会把header里的参数去掉下划线
- Java的设计模式——单例
- 博弈论(一):Nim游戏
- stl各种类型大致分析
- servlet实现文件下载
- 企业大数据平台一:企业需求及相关的基本组件
- 【Kruskal+dfs】BZOJ1016- [JSOI2008]最小生成树计数
- C++读取、旋转和保存bmp图像文件编程实现
- Apache Flink Client生成StreamGraph