算法设计与分析(第二版)上机实验题——C语言实现

更新ing

第一章

实验1.统计求最大、最小元素的平均比较次数

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int a[10],i,b,c,d=0,e,f;
    srand((unsigned)time(NULL));
	printf("有下列数字:");
    for (i = 0; i < 10; i++)
	{
	a[i] = rand()%20;
	printf("%d ",a[i]);
    }
	printf("\n");
	for(c=1;c<10;c++){
	d++;
	if(a[0]<a[c]){
	f=a[0];
	a[0]=a[c];
    a[c]=f;
   }
  }
 printf("最大值为:%d\n",a[0]);
  for(e=1;e<10;e++){
  d++;
  if(a[0]>a[e]){
    f=a[0];
    a[0]=a[e];
    a[e]=f;
   }
  }
 printf("最小值为:%d\n",a[0]);
 printf("比较次数为:%d\n",d);
     return 0;
}

运行结果如下:
在这里插入图片描述
解决方法:
所采用的是冒泡排序的循环比较,不过不需要排序,只需要找出最大值,最小值即可。用一个for循环,用第一个数和其他数进行比较,遇到大于第一个数的就进行值交换,直到比完最后一个数的时候,此时第一个数就是最大的,同理最小的也一样,碰到小于它的数就进行值交换。

实验2.求无序序列中第k小的元素

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int i,b,c,d,e=0,f,k;
	int a[10];
	printf("输入的k值为:"); 
	scanf("%d",&k);
    srand((unsigned)time(NULL));
	printf("有下列数字:\n");
    for (i=0;i<=10;i++)
	{
	a[i] = rand()%100;
	printf("%d ",a[i]);
	}
	printf("\n");
	for(b=0;b<10;b++){
	  for(c=b+1;c<10;c++){
	   if(a[b]>a[c]){
	    d=a[b];
	    a[b]=a[c];
	    a[c]=d;
	  }
	}
  }
  printf("从小到大的顺序如下:\n");////题目并没有要求输出顺序的数字,我这里输出只是为了更好的观察,可以去掉输出排序后的数组代码
  for(f=0;f<10;f++){
  	printf("%d ",a[f]);
  }
  printf("\n");
  printf("第%d小的数字是:%d",k,a[k-1]);
     return 0;
}

运行结果如下:
在这里插入图片描述

解决方法:
用一个排序的方法将所有的数排序,从大到小或者从小到大都行,并且用数组存储起来,这样数组的第一个是最大或者最小,最后一个亦然,输出第k个数对应的数组序号即可这里要注意数组是从0开始的,我们是从第一个开始数的,所以要对数组内的数进行减一处理。

posted @ 2021-03-10 09:38  Garbage-D  阅读(101)  评论(0)    收藏  举报