归并排序的递归算法
来源:互联网 发布:360炒股软件 编辑:程序博客网 时间:2024/04/29 23:37
递归算法有个关键就是递归结束的条件。代码如下:
//bugs:算法中有个小bug,就是我没有考虑到(n+1)/2时,n+1为奇数的情况。
#include <stdio.h>#include <conio.h>#define MAX 1000//函数原型void swap(int *a,int *b);void sort_parallel(int target[],int start1,int start2,int num,int n);void merge_sort_recurrence(int target_array[],int n);int main(){int test[]={3,1,2,6,4,11,5,8,7,10};merge_sort_recurrence(test,10);for(int i=0;i<10;i++)printf("%d ",test[i]);getch();}//归并排序(递归法)void merge_sort_recurrence(int target_array[],int n){if(n==1)return ;if(n==2){if(target_array[0]>target_array[1])swap(&target_array[0],&target_array[1]);}merge_sort_recurrence(target_array,(n+1)/2);merge_sort_recurrence(target_array+(n+1)/2,n/2);sort_parallel(target_array,0,(n+1)/2,(n+1)/2,n);}//为两个有序序列进行排序 void sort_parallel(int target[],int start1,int start2,int num,int n){int flag=0;int temp_array[MAX]={0};int i=0,j=0;while(i<num && j<num && start1+i<n && start2+j<n ){if(target[start1+i]<target[start2+j]){temp_array[flag++]=target[start1+i];i++;}else if(target[start1+i]==target[start2+j]){temp_array[flag++]=target[start1+i];i++; j++;}else{temp_array[flag++]=target[start2+j];j++;}}while(i<num && start1+i<n)temp_array[flag++]=target[start1+i++]; while(j<num && start2+j<n)temp_array[flag++]=target[start2+j++];//把有序序列覆盖到原数组for(i=start1,j=0;i<n && i<start1+2*num;i++,j++)target[i]=temp_array[j];}//交换void swap(int *a,int *b){int temp=*a;*a=*b;*b=temp;}总结:递归的写法比非递归简单,但是开销更大。
相关文章:归并排序的非递归算法 堆排序
- 归并排序的递归算法
- 分治+递归:归并排序的递归算法
- 归并排序递归算法
- 归并排序的非递归算法
- 递归的归并排序
- 归并排序算法(递归实现)
- 归并排序算法(递归实现)
- 归并排序非递归算法
- 递归算法学习---归并排序
- 插入排序、归并排序和递归算法的复杂性分析
- 插入排序、归并排序和递归算法的复杂性分析
- [PFW-EXAM]二路归并的排序算法(递归)
- java中归并排序算法的递归与迭代
- 算法积累<2>归并排序非递归的实现
- Java数据结构和算法-归并排序的递归应用
- list容器的特殊sort()算法:非递归--归并排序
- 递归算法(归并排序):求排列的逆序数
- Java实现的归并排序算法(递归优化版)
- 修改 /etc/apt/sources.list
- 广州生活
- 正则表达式学习指南(三)----字符
- DataNode节点上数据块发送器——BlockSender
- qt隐藏滚动条
- 归并排序的递归算法
- 2011-1-10
- maven2完全使用手册
- EJB
- 关于 RCP服务器不可用的问题
- Eclipse 常用快捷键
- 处理网页中png的透明背景
- 新开发任务
- 界面测试心得