第5章 数组,矩阵与广义表题目

综合应用题:
1.设数组A[0,…,n-1]的n个元素中元素中有多个零元素,设计一个算法,将A中非零元素依次移动到A数组的前端。

#include<stdio.h>
void movelement(int A[],int n){
	int i=-1,j,temp;
	for(j=0;j<n;j++){
		if(A[j]!=0){
			++i;
			if(i!=j){
				temp=A[i];
				A[i]=A[j];
				A[j]=temp;
			}
		}
	}
}
void display(int A[],int n){
	int i;
	for(i=0;i<n;i++){
		printf("%d  ",A[i]);
	}
}
int main(){
	int a[]={1,0,0,1};
	int n=sizeof(a)/sizeof(int);
	movelement(a,n);
	display(a,n);
	return 0;
}

结果是:
在这里插入图片描述
2.关于浮点型数组A[0,…,n-1],试设计实现下列运算的递归算法
(1),求数组A中最大的值。
实现代码如下:

#include<stdio.h>
float findmax(float A[],int i,int j){
	float max;
	if(i==j){
		return A[i];
	}else{
		max=findmax(A,i+1,j);
		if(A[i]>max){
			return A[i];
		}else{
			return max;
		}
	}
}
int main(){
	float A[]={1.0,2.3,9.5,6,7},result;
	int n=sizeof(A)/sizeof(float); 
	result=findmax(A,0,n-1);
	printf("%.2f",result);
	return 0;
} 

结果是:
在这里插入图片描述
(2)求数组中n个数之和

#include<stdio.h>
float arraysum(float A[],int i,int j){
	if(i==j){
		return A[i];
	}else{
		return A[i]+arraysum(A,i+1,j); 
	}
}
int main(){
	float A[]={1.0,2.3,9.5,6,7},sumresult;
	int n=sizeof(A)/sizeof(float); 
	sumresult=arraysum(A,0,n-1);
	printf("数组元素之和:%.2f",sumresult);
	return 0;
} 

结果是:
在这里插入图片描述
(3)求数组中n个数的平均值

#include<stdio.h>
float arrayavg(float A[],int i,int j){
	if(i==j){
		return A[i];
	}else{
		return (A[i]+(j-i)*arrayavg(A,i+1,j))/(j-i+1);
	}
}
int main(){
	float A[]={1.0,2.3,9.5,6,7},avgresult;
	int n=sizeof(A)/sizeof(float); 
	avgresult=arrayavg(A,0,n-1);
	printf("数组的平均值为:%.2f\n",avgresult);
	return 0;
} 

结果为:
在这里插入图片描述
总的程序

#include<stdio.h>
float findmax(float A[],int i,int j){
	float max;
	if(i==j){
		return A[i];
	}else{
		max=findmax(A,i+1,j);
		if(A[i]>max){
			return A[i];
		}else{
			return max;
		}
	}
}
float arraysum(float A[],int i,int j){
	if(i==j){
		return A[i];
	}else{
		return A[i]+arraysum(A,i+1,j); 
	}
}
float arrayavg(float A[],int i,int j){
	if(i==j){
		return A[i];
	}else{
		return (A[i]+(j-i)*arrayavg(A,i+1,j))/(j-i+1);
	}
}
int main(){
	float A[]={1.0,2.3,9.5,6,7},maxresult,sumresult,avgresult;
	int n=sizeof(A)/sizeof(float); 
	maxresult=findmax(A,0,n-1);
	sumresult=arraysum(A,0,n-1);
	avgresult=arrayavg(A,0,n-1);
	printf("数组最大值为:%.2f\n",maxresult);
	printf("数组元素之和:%.2f\n",sumresult);
	printf("数组的平均值为:%.2f\n",avgresult);
	return 0;
} 

结果为:
在这里插入图片描述
3.试设计一个算法,将数组A[0…,n-1]中所有奇数移到偶数之前,要求不另增加存储空间,且时间复杂度为o(n).

#include<stdio.h>
void divide(int A[],int n){
	int i=0,j=n-1,temp;
	while(i<j){
		while((A[i]%2==1)&&(i<j)){//循环扫描数组,将i停在A中的偶数上 
		        ++i;	
		}		
		while((A[j]%2==0)&&(i<j)){//循环扫描数组,将j停在A中的奇数上
			--j;
		}
		if(i<j){
			temp=A[i];
			A[i]=A[j];
			A[j]=temp;
			++i;
			--j;
		} 
	}
} 

void display(int A[],int n){
	int i;
	for(i=0;i<n;i++){
		printf("%d   ",A[i]);
	} 
}
int main(){
	int A[]={1,2,3,4,5,9};
	int n=sizeof(A)/sizeof(int);
	divide(A,6);
	display(A,n);
	return 0;
} 

结果是:
在这里插入图片描述
4.设有一个元素为整数的线性表L,存放在一维数组A[0,…,n-1]中,设计一个算法,以A[n-1]为参考量,将该数组分为左右两个部分,其中左半部分的元素均小于等于A[n-1],右半部分的元素值均大于A[n-1],A[n-1]则位于两部分之间。要求结果存放在数组A中

#include<stdio.h>
void divide(int A[],int n){
	int temp;
	int i=0,j=n-1;
	temp=A[i];
	A[i]=A[j];
	A[j]=temp;
	temp=A[i];
	while(i!=j){
		while(j>i&&A[j]>temp)--j;
		if(i<j){
			A[i]=A[j];
			++i;
		}
		while(i<j&&A[i]<temp)++i;
		if(i<j){
			A[j]=A[i];
			--j;
		}
	} 
	A[i]=temp;
}
void display(int A[],int n){
	int i;
	for(i=0;i<n;i++){
		printf("%d   ",A[i]);
	} 
}
int main(){
	int A[]={111,2,32,4,1,9};
	int n=sizeof(A)/sizeof(int);
	divide(A,6);
	display(A,n);
	return 0;
} 

结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值