综合应用题:
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;
}
结果为: