归并排序 递归和非递归实现
2015-07-12 14:17
453 查看
归并递归实现
非递归实现 从小到大排序
/* 名称:归并排序 递归调用 自顶向下 描述:将数组arr的从p到r进行排序. merge负责进行将两个已经排序的函数进行归并 flag=0 从小到大排序 flag=非0 从大到小排序 算法复杂度: n*logn 时间:15.7.11 Jason Zhou 热爱你所写下的程序,他是你的伙伴,而不是工具. */ #include<iostream> using namespace std; void print_arr(int arr[],int len) { cout<<"-----------"<<endl; for(int i=0;i<len;i++) cout<<arr[i]<<endl; } //合并 int merge(int arr[],int p,int q,int r,int flag) { cout<<"merge: p="<<p<<" q="<<q<<" r="<<r<<endl; int l1=q-p+1; int l2=r-q; int *ta=new int[l1]; int *tb=new int[l2]; for (int i1=0;i1<l1;i1++) { ta[i1]=arr[p+i1];//注意 p+i1 } for (int i2=0;i2<l2;i2++) { tb[i2]=arr[q+i2+1];//注意 q+i2+1 } int a1=0; int b1=0; int k=p; if (!flag) { while( ( a1<l1)&&( b1<l2 ) ) { if ( ta[a1]<tb[b1] ) { arr[k++]=ta[a1++]; } else { arr[k++]=tb[b1++]; } } } else { while( ( a1<l1)&&( b1<l2 ) ) { if ( ta[a1]<tb[b1] ) { arr[k++]=tb[b1++]; } else { arr[k++]=ta[a1++]; } } } while(a1<l1) { arr[k++]=ta[a1++]; } while(b1<l2) { arr[k++]=tb[b1++]; } delete ta; delete tb; return 0; } int merge_sort(int arr[],int p,int r,int flag) { if (p<r) { int q=(p+r)/2; cout<<"sort1: p="<<p<<" q="<<q<<" r="<<r<<endl; merge_sort(arr,p,q,flag); merge_sort(arr,q+1,r,flag);//注意 q+1 cout<<"sort2: p="<<p<<" q+1="<<q+1<<" r="<<r<<endl; merge(arr,p,q,r,flag); } return 0; } int main() { int a[]={1,33,13,77,343,2345535,232}; merge_sort(a,0,6,1); print_arr(a,7); return 0; }
非递归实现 从小到大排序
/** * merge_sort: 归并排序 非递归实现 --迭代 * 非递归思想: 将数组中的相邻元素两两配对。用merge函数将他们排序, * 构成n/2组长度为2的排序好的子数组段,然后再将他们排序成长度为4的子数组段, * 如此继续下去,直至整个数组排好序。 参考:http://www.cnblogs.com/bluestorm/archive/2012/09/06/2673138.html 时间:15.7.12 Jason Zhou 热爱你所写下的程序,他是你的伙伴,而不是工具. **/ #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define LEN 8 // merge_sort(): 非递归实现-自底向上 // 将原数组划分为left[min...max] 和 right[min...max]两部分 void merge_sort(int *list, int length) { int i, left_min, left_max, right_min, right_max, next; int *tmp = (int*)malloc(sizeof(int) * length); if (tmp == NULL) { fputs("Error: out of memory\n", stderr); abort(); } for (i = 1; i < length; i *= 2) // i为步长,1,2,4,8…… { for (left_min = 0; left_min < length - i; left_min = right_max) { right_min = left_max = left_min + i; right_max = left_max + i; cout<<"left_min="<<left_min<<" left_max="<<left_max<<" right_min"<<right_min<<" right_max="<<right_max<<endl; if (right_max > length) right_max = length; next = 0; while (left_min < left_max && right_min < right_max) tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++]; //tmp 就是从小到大排列的 while (left_min < left_max) list[--right_min] = list[--left_max]; while (next > 0) list[--right_min] = tmp[--next]; //先放大的,按照从小到大排列 cout<<"-----------"<<endl; for (int jj=0;jj<LEN;jj++) { cout<<list[jj]<<" "; } cout<<endl; } } free(tmp); } int main(void) { int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 }; merge_sort(a, LEN); // print array int i; for (i = 0; i < LEN; i++) printf("%d ", a[i]); return 0; }
相关文章推荐
- 【Balanced Binary Tree】cpp
- 弹窗开关js
- 高可用集群原理
- maxsum
- yii2文件(图片)上传,url保存到数据表
- poj解题报告——3254
- 【DP】 HDOJ 5282 Senior's String
- BZOJ 4116 Wf2015 Tours Tarjan
- Linux 网络编程常用函数详解
- 数据结构基础温故-4.树与二叉树(上)
- 20150712 We can locate ourselves with the GPS
- CAXA2007、2011,2013二次开发
- iOS,viewWithTag搜索机制
- Xcode自动注释插件
- java异常分析(一)
- C语言调试接口
- 最大子段和问题及其推广
- 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)
- Hibernate内置对象标识符(OID)生成器