算法设计实验题
法一:
//法一:排序时计算比较次数
//统计最大、最小元素的平均比较次数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double sum=0;
void compare(int a[10])
{
int i,j,flag=0,temp;
//比较+排序
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag++;
sum++;
}
}
}
printf("排序后:");
for(j=0;j<10;j++)
printf("%d ",a[j]);
printf("\n");
printf("最小的数为:%d\n",a[0]);
printf("最大的数为:%d\n",a[9]);
printf("比较次数:%d\n",flag);
}
int main()
{ int a[10];
int i,j;
srand(time(0));
for(j=0;j<10;j++)
{
printf("产生的数列为:");
for(i=0;i<10;i++)
{
a[i]=1+rand()%20;
printf("%d ",a[i]);
}
compare(a);
}
printf("平均比较了%lf次",sum/10);
return 0;
}
法二:
//法二:不用排序,直接计算比较次数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
double sumcomp=0;
void randa(int a[],int n) //随机产生20以内的n个数
{ int i;
for(i=0;i<n;i++)
a[i]=rand()%20+1;}
void MaxMin(int a[],int n,int comp)
{
int i,max,min;
max=min=a[0];
comp=0;
for(i=1;i<n;i++)
{
comp++;
if(a[i]>max) max=a[i];
else
{ comp++;
if(a[i]<min) min=a[i];}
}
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf(" max=%d,min=%d,aver=%d\n",max,min,comp);
sumcomp=sumcomp+comp;
}
int main()
{
int a[N];
int i,comp;
srand(time(NULL));
for(i=1;i<=10;i++)
{
printf("%3d:",i);
randa(a,10);
MaxMin(a,10,comp);
}
printf("sumcomp=%.0f\n",sumcomp);
printf("aver=%.2f",sumcomp/10);
return 0;
}