递归算法有个关键就是递归结束的条件。代码如下:
//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;
}
总结:递归的写法比非递归简单,但是开销更大。
相关文章:归并排序的非递归算法 堆排序