归并排序
2015-11-05 09:48
501 查看
// 归并排序,理解起来不是特别难,只是代码修改的让我头疼,足足找了两个多小时才找到错误。
// 归并排序
// 归并排序
#include #include using namespacestd; // 对归并排序的整体理解,就是把数组不停的分割,直到分割成一个个的元素,然后再进行整合,整合的过程类似与一个倒置的二叉树 void Mersge( int * SR ,int * TR ,int s ,int m ,int _length){ int j,k,l; for( j=m+1 , k=s; j<=_length && s<=m ; k++){ if(SR[s]<SR[j]){ cout<<s<<"s~~"<<SR[s]<<endl; TR[k] = SR[s++]; // cout<<"TR["<<k<<"] = "<<TR[k]<<endl; } else{ cout<<j<<"j~~"<<SR[j]<<endl; TR[k] = SR[j++]; // cout<<"TR["<<k<<"] = "<<TR[k]<<endl; } } if(s<=m){ cout<<"k~~"<<k<<endl; for(l=0 ; l<=m-s+1 ; l++){ TR[k++] = SR[s++]; cout<<s<<"_s~~"<<SR[s-1]<<endl; // cout<<"TR["<<k<<"] = "<<TR[k]<<endl; } } if(j<=_length){ cout<<"k~~"<<k<<endl; for(l=0 ; l<=_length-j+1 ; l++){ TR[k++] = SR[j++]; cout<<j<<"_j~~"<<SR[j-1]<<endl; // cout<<"TR["<<k<<"] = "<<TR[k]<<endl; } } for(int p=1;p<=k;p++) cout<<"TR[p]"<<TR[p]<<" "; cout<<endl; } void Msort(int * SR ,int * TR ,int s ,int _length ){ int m;// Midle int TR2[_length+1]; if(s == _length){ //这时候s等于1 ,Msort到了最后拆分的只有一个数组的时候 TR[s] = SR[s]; } else{ //s=1 m = (s+_length)/2; // 这样会把sr分割得刚好比tr多一个元素,将sr分为sr[1,m]与sr[m=1,_length]两部分 Msort( SR, TR2, s, m);//将sr[1,m]归并为有序的 TR2[1,m] Msort( SR, TR2, m+1, _length);//将sr[m+1,_length]归并为有序的TR2[m+1,_length]; // 将递归得到的 TR2[1,_length]归并为有序的 TR[1,_length],而上变的两个TR2从m分开来使用 Mersge(TR2, TR, s, m, _length); } } void _MergeSort(int* _arr,int _length){ Msort(_arr,_arr,1,_length); } int main(int argc,constchar * argv[]) { // int a=1; // int b=2; // _swap(&a,&b); // cout<<a<<" "<<b<<endl; int arr[] = {0,9,6,5,7,11,34,2,8,1,10}; //第一个元素必须置空,因为二叉树里没有第0个元素,0*2永远=0 int length =sizeof(arr)/sizeof(*arr); _MergeSort(arr,length-1); for(int i=1 ; i<length ; i++) cout<<arr[i]<<" "; }
相关文章推荐
- 异常控制流
- vmsata 监控命令详解
- 鸟哥的Linux私房菜(基础篇)- 鸟哥的第一本书的主要内容,以 Mandrake 9.0 为例
- 鸟哥的Linux私房菜(基础篇)- Red Hat 6.x旧文件
- Dubbo架构设计详解
- C118+osmocombb 实验总结_20151105_莫小贝
- keymob github 地址
- Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分
- 小旭的互联网营销之微信营销
- Builder
- 鸟哥的Linux私房菜(基础篇)- 简易且较小安装Red Hat 7.2
- JS实现自定义简单网页软键盘效果代码
- 鸟哥的Linux私房菜(基础篇)- 一个简单的 SPFdisk 分割实例
- 一个面向对象的应用
- VC++2010学习版 带命令行参数的程序调试
- Android JSON:Gson,FastJson解析库的使用和对比分析
- 硬盘划分主分区、扩展分区、逻辑分区、活动分区有什么不同?
- 堆排序
- 每个程序员都会的 35 个 jQuery 小技巧
- 鸟哥的Linux私房菜(基础篇)- 一些基础的Linux 问题