归并排序的递归算法

来源:互联网 发布: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;}
        总结:递归的写法比非递归简单,但是开销更大。


相关文章:归并排序的非递归算法     堆排序