算法设计与分析(第⼆版)上机实验题——C语⾔实现
算法设计与分析
第⼀章
实验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));
importadora pequitos toys
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);
return0;
}
运⾏结果如下:
解决⽅法:
所采⽤的是冒泡排序的循环⽐较,不过不需要排序,只需要出最⼤值,最⼩值即可。⽤⼀个for循环,⽤第⼀个数和其他数进⾏⽐较,遇到⼤于第⼀个数的就进⾏值交换,直到⽐完最后⼀个数的时候,此时第⼀个数就是最⼤的,同理最⼩的也⼀样,碰到⼩于它的数就进⾏值交换。
实验2.求⽆序序列中第k⼩的元素
代码如下:
int i,b,c,d,e=0,f,k;
int a[10];
printf("输⼊的k值为:");ipconfig怎么读
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]);
return0;
赢家时尚pos系统}
运⾏结果如下:
解决⽅法:
⽤⼀个排序的⽅法将所有的数排序,从⼤到⼩或者从⼩到⼤都⾏,并且⽤数组存储起来,这样数组的第⼀个是最⼤或者最⼩,最后⼀个亦然,输出第k个数对应的数组序号即可这⾥要注意数组是从0开始的,我们是从第⼀个开始数的,所以要对数组内的数进⾏减⼀处理。
上⾯的代码有⼀点问题,就是⽆法排除相同数字在的排序。
例如下⾯:
这⾥第三⼩的数字应该为4,输出的却是2,是因为没有去除相同数字在的排序。下⾯的代码我采⽤了桶排序来解决这个问题,原理为:采⽤数组,利⽤数组下标来记录数字,数字为15对应的是数组a[15],当这个数字存在时,就把这个对应下标的数赋值为1,当后⾯仍存在相同的数时,仍然赋值为1,这样就去除了相同的数字。并且,这样也实现了排序,当统计完数字之后,就⽤for循环来判断值是否为1,为1则输出对应的下标。
int a[1000],i,b,n,j=0,k,m[1000];
for(i=0;i<1000;i++){
a[i]=0;
}
scanf("%d",&n);
srand((unsigned)time(NULL));
printf("有下列%d个数字:\n",n);
for(i=0;i<n;i++)
{
b =rand()%100;
printf("%d ",b);
a[b]=1;
}//这⾥是产⽣随机数,并把相对应的下标的数赋值为1
printf("\n从⼩到⼤排序为(且⽆重复数字):\n");
for(i=0;i<1000;i++){
if(a[i]==1){
printf("%d ",i);
m[j]=i;
j++;
}
}
printf("\nk=");
scanf("%d",&k);
printf("\n第%d⼩的数是:%d",k,m[k-1]);
return0;
}
运⾏结果如下:
这个代码是⽤空间换时间,你也可以⽤其他⽅法去除重复数字,⽐如,排完序之后,判断相邻的数是否相同,相同的话就把后⾯的数向前移动来覆盖掉这个数字。
实验3.出队第k个元素
代码如下:
typedef struct queue{//结构体来创建队列
int data[100];
int head=0;
int tail=0;
}queue;
struct queue qu;//创建队列qu
struct queue another;//辅助队列
int main(){
int i,k,n;
printf("输⼊队列的⼤⼩为:");
scanf("%d",&n);
printf("输⼊队列的数为:\n");
for(i=0;i<n;i++){
scanf("%d",&qu.data[i]);//传数进⼊队列
qu.tail++;//队尾后移
}
printf("k值为:");
scanf("%d",&k);
for(i=0;i<n;i++){
if(qu.head!=k-1){//判断是否是第k个元素
another.data[another.tail]=qu.data[qu.head];//把数传给辅助队列
qu.head++;//qu队⾸往后移
another.tail++;//辅助队列队尾后移,因为往⾥⾯传了数
}
else{
printf("出队的是:%d",qu.data[qu.head]);//出队第k个元素
qu.head++;
html网页制作波浪线
}
}
qu=another;//将辅助队列赋值给主队列
qu.head=0;
printf("\n");
printf("剩下的数为:\n");
for(i=0;i<n-1;i++){
printf("%d\n",qu.data[qu.head]);
qu.head++;
}
return0;
}
执⾏结果如下:
思想:因为题⽬说出队,我就想到了队列,认为此题要⽤队列来做(其实也可以⽤其他来,只要符合题⽬要求即可)。这⾥我⽤了连个队列,⼀个辅助队列。先传数值进⼊队列,因为队列是先进先出,所以循环从第⼀个出队,并且把出队的传给辅助队列,直⾄到达第k个元素,第k个元素单独出队,并且不传给辅助队列,之后的也继续出队传给辅助队列,最后将辅助队列的数赋值给主队列,题⽬要求其余元素不变。
简单⼀点的话可以⽤数组来来实现
实验4.设计⼀种好的数据结构
编写⼀个实验程序,设计⼀种好的数据结构,尽可能⾼效地实现元素的插⼊、删除、按值查和按序号查(假设所有元素值不同)。
typedef struct queue{
int data[100];
int head=0;
int tail=0;
}queue;
struct queue one;
//添加
void add(queue &a,int b){
a.data[a.tail]=b;
a.tail++;
printf("%d\n",b);
}
//按序号删除
void del(queue &a,int b){
int i;
int j;
j=a.tail-1;
for(i=b;i<j;i++){
a.data[i]=a.data[i+1];
}
a.tail++;
}
/
/按序号查
int sortNumber(queue &a,int b){
int temp;
temp=a.data[b];
return temp;
}
//按值查(题意为没有重复的值,并且按值查应该返回相应的序号)linux查看目录内容命令
int sortValue(queue &a,int b){
int i=0,temp;
for(i;i<a.tail;i++){
if(a.data[i]==b){
temp=i;
return temp+1;
}
}
return-1;
}
int main(void){
add(one,7);
add(one,5);
add(one,3);
add(one,6);
int a=sortNumber(one,2);
printf("%d\n",a);冒泡排序代码c语言
int b=sortValue(one,2);
printf("%d\n",b);
del(one,7);
printf("%d\n",one.data[one.head]);
}
思路:⽤数组模拟队列来实现这个数据结构,题⽬是说插⼊元素,我默认是按照插⼊队尾,所以⽤数组最好实现,数组也很⽅便的按照序号查,另外也可以⽤链表来实现,数组也可以实现插⼊到中间,只是要把在那个元素后⾯的都要往后移,⽐链表⿇烦⼀点。
实验5.设计⼀种好的数据结构
编写⼀个实验程序,设计⼀个好的数据结构,尽可能⾼效地实现下列功能:
1.插⼊若⼲个整数序列
2.获得该序列的中位数,中位数是指从⼩到⼤排序的中间的数,奇数序列只有⼀个,偶数序列有两个

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。