【发布时间】:2015-03-26 15:11:08
【问题描述】:
我一直被教导和阅读递归方法比迭代方法慢,因为递归需要分配一个新的堆栈帧。我记得这是两者的明显区别之一。
但是,在以下 C 程序中,我看到递归函数比迭代函数快。!!!
/****Bubble Sort (by iteration)****/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/****Bubble Sort Function declaration****/
void sort(int *,int);
/****Main Function****/
int main()
{
int n,*arr,i;
float exetime;
clock_t cstart,cend=0;
printf("Enter the number of elements: ");
scanf("%d",&n);
arr=malloc(n*sizeof(int));
printf("Enter the array elements: ");
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
cstart=clock(); //starting time
for(i=0;i<10000;i++)
sort(arr,n);
cend=clock(); //end time
exetime=(float)(cend-cstart)/CLOCKS_PER_SEC;
printf ("%.4f \xC2\xB5sec\n",exetime*100);
for(i=0;i<n;i++)
printf("%-2d",arr[i]);
free(arr);
return 0;
}
/****Bubble Sort Function****/
void sort(int *arr,int n)
{
int i,j,temp;
for(i=0;i<=n-2;i++)
for(j=0;j<=n-2-i;j++)
if(arr[j+1]<arr[j])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
输出:
输入元素个数:5
输入数组元素:5 4 3 2 1
0.1262 微秒
1 2 3 4 5
/****Bubble Sort (by recursion)****/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/****Bubble Sort Function declaration****/
void sort(int *,int);
/****Main Function****/
int main()
{
int n,*arr,i;
float exetime;
clock_t cstart,cend=0;
printf("Enter the number of elements: ");
scanf("%d",&n);
arr=malloc(n*sizeof(int));
printf("Enter the array elements: ");
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
cstart=clock(); //starting time
for(i=0;i<10000;i++)
sort(arr,n);
cend=clock(); //end time
exetime=(float)(cend-cstart)/CLOCKS_PER_SEC;
printf ("%.4f \xC2\xB5sec\n",exetime*100);
for(i=0;i<n;i++)
printf("%-2d",arr[i]);
free(arr);
return 0;
}
/****Bubble Sort Function****/
void sort(int *arr,int n)
{
static int i=0;
int j,temp;
for(j=0;j<=n-2-i;j++)
if(arr[j+1]<arr[j])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
if(++i<=n-2)
sort(arr,n);
}
输出:
输入元素个数:5
输入数组元素:5 4 3 2 1
0.0227 微秒
1 2 3 4 5
【问题讨论】:
-
您必须多次执行程序并取平均时间才能使您的结果有意义。您每次运行了多少次?
-
你是如何编译你的程序的(
gcc -Wall -O2)?您是否要求编译器进行优化?确保有一个有意义的运行时(所以有一个输入让它运行几秒钟),并重复几次基准测试! -
顺便说一句,谁告诉你递归比迭代慢?
-
@BasileStarynkevitch 我通过 (gcc bubble.c -lrt) 编译它是不是正确的?
-
@iharob 是的,正如您所见,该函数被调用了 10000 次,因此结果是所有函数的平均值
标签: c sorting recursion iteration execution-time