1、设数组A[0~n-1]的n个元素中有多个0元素,设计算法将所有非零元素移动到数组前端。
void Move(int A[],int n){
int i=-1,j,temp;
for(int j=0;j<n;j++){
if(A[j]!=0){
++i;
if(i!=j){
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
}
2、关于浮点型数组A[0~n-1]设计递归算法实现:(1)求数组A的最大值(2)求数组n个数之和(3)求数组n个数的平均值
find_max(A,0,n-1);
float Find_max(float A[],int i,int j){
// int max=A[0];
// int pos;
// for(int i=0;i<n;i++){
// if(A[i]>max){
// max=A[i];
// pos=i;
// }
// }
// return pos;
float max;
if(i==j) return A[i];
else{
max=find_max(A,i+1,j);
if(A[i]>max) return A[i];
else return max;
}
}
Sum(A,0,n-1);
float Sum(float A[],int i,int j){
// float sum=0;
// for(int i=0;i<n;i++){
// sum+=A[i];
// }
// return sum;
if(i==j) return A[i];
else return A[i]+Sum(A,i+1,j);
}
Average(A,0,n-1);
float Average(float A[],int i,int j){
// float sum=Sum(A,n);
// float average=sum/n;
if(i==j) return A[i];
else return (A[i]+(j-i)*Average(A,i+1,j))/(j-i+1);
}
3、设计算法将数组A的所有奇数移动到偶数之前,不增加存储空间且时间复杂度On
void Move(int A[],int n){
int i=0,j=-1,temp;
while(i<j){
while(A[i]%2==1&&i<j) ++i;
while(A[j]%2==0&&i<j) --j;
if(i<j){
temp=A[i];
A[i]=A[j];
A[j]=temp;
++i;
--j;
}
}
}
4、设有一元素为整数的线性表L,存在数组中,设计算法以最后一个元素为准,进行快排一次划分
5、设计算法,对给定m*n矩阵A,统计矩阵具有下列特征的元素个数并输出他们的坐标及数值:它们既是所在行中的最小值,有事所在列中的最小值;它们既是所在行中的最大值又是所在列中的最大值。假设矩阵中元素各不相同,要求结果在处理过程中用输出语句输出。
void printmin(int A[][maxSize],int m,int n){
int i,j,k,min,minj; //minj记录i行上最小值的列号
int flag;
for(int i=0;i<m;i++){
min=A[i][0];
minj=0;
for(int j=0;j<n;j++){
if(A[i][j]<min){
min=A[i][j];
minj=j;
}
flag=1;
}
for(int k=0;k<m;k++){
if(min>A[k][minj]){
flag=0;
break;
}
}
if(flag) printf("%d",A[i][minj]);
}
}
void printmax(int A[][maxSize],int m,int n){
int i,j,k,max,maxj;
int flag;
for(i=0;i<m;++i){
if(A[i][j]>max){
max=A[i][j];
maxj=j;
}
flag=1;
for(k=0;k<m;k++){
if(max<A[k][maxj]){
flag=0;
break;
}
}
if(flag) printf("%d",A[i][maxj]);
}
}
6、简要介绍稀疏矩阵的三元组存储结构特点,并实现稀疏矩阵的基本操作
(1)给定稀疏矩阵A(int),创建其三元组存储结构B
(2)查找给定元素x是否在矩阵中
三元组存储结构是一种顺序结构,因此也是一种顺序表,表中的每个结点对应稀疏矩阵的一个非零元素,其中包括三个字段,分别为该元素的值、行下表和列下标。另外,用第0行的第1个元素存储矩阵中非零元素的个数,第0行的第2个元素存储矩阵的行数,第0行的第3个元素存储矩阵的列数。
void create(int A[][maxSize],int m,int n,int B[][3]){
int i,j,k=1;
for(i=0;i<m;++i){
for(j=0;j<n;++j){
if(A[i][j]!=0){
B[k][0]=A[i][j];
B[k][1]=i;
B[k][2]=j;
++k;
}
}
}
B[0][0]=k-1;
B[0][1]=m;
B[0][2]=n;
}
int Search(int B[][3],int x){
int i,t;
t=B[0][0];//非零元素个数
i=1;
while(i<=t&&B[i][0]!=x) i++;
if(i<=t) return 1;
else return 0;
}
7、假设稀疏矩阵A采用三元组表示,编写函数计算其转置矩阵B,B也用三元组表示
- 互换三元组中各个元素的行下标和列下标,并将其按照原矩阵列优先的顺序存储。
- 原矩阵:A 转置矩阵:B
- 在A中找到第一列中的所有元素,他们是B的第一行的非零元素,并依次放在B的三元组中
void transpose(int A[][3],int B[][3]){
int p,q,col;
B[0][0]=A[0][0];
B[0][1]=A[0][2];
B[0][2]=A[0][1];
if(B[0][0]>0) {
q=1;
for(col=0;col<B[0][0];++col){ //按列转置
for(p=1;p<=B[0][0];++p){
if(A[p][2]==col){
B[q][0]=A[p][0];
B[q][1]=A[p][2];
B[q][2]=A[p][1];
++q;
}
}
}
}
}