天勤2022数据结构(四)数组、矩阵与广义表
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、綜合應用題
- 總結(jié)
前言
提示:這里可以添加本文要記錄的大概內(nèi)容:
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、綜合應用題
設數(shù)組A[0,…,n-1]的n個元素中有多個零元素,設計一個算法,將A中所有的非零元素依次移動到A數(shù)組的前端
void move(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;}}} }關于浮點型數(shù)組 A[0,…,n-1],試設計實現(xiàn)下列運算的遞歸算法
-
求數(shù)組A中的最大值。
float findmax(float A[], int i, int j){if(i == j){return A[i];}return A[i] > findmax(A, i+1, j)? A[i]: findmax(A, i+1, j); } -
求數(shù)組中n個數(shù)之和
float sum(float A[], int i, int j){if(i == j){return A[i];}return A[i] + sum(A[i], i+1, j); } -
求數(shù)組中n個數(shù)的平均值
float avg(float A[], int i, int j){if(i == j){return A[i];}return (A[i] +(j-i) * avg(A, i+1, j)) / (j-i+1); }
試設計一個算法,將數(shù)組 A[0,…,n-1]中 所有奇數(shù)移到偶數(shù)之前。要求不另增加存儲空間,且時間復雜度為O(n)
void divide(int A[], int n){int i = 0, j = n - 1, temp;while(i<j){while(i<j && A[i]%2 == 1){ 找第一個偶數(shù)i++;}while(i<j && A[j]%2 == 0){ 找最后一個奇數(shù)j--;}if(i<j){temp = A{i];A[i] = A{j];A[j] = temp;i++;j--;}} }設有一元素為整數(shù)的線性表L,存放在一維數(shù)組A[0,…,n-1]中,設計一個算法,以A[n-1]為參考量,將該 數(shù)組分為左右兩個部分 ,其中左半部分的元素值均小于等于A[n-1],右半部分的元素值均大于A[n-1],A[n-1]則位于這兩部分之間要求結(jié)果仍存放在數(shù)組A中
快排劃分
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]; 相當與把n-1位置元素放到0位置上,仍以0位置元素為參考量while(i!=j){while(i<j && A[j]>temp) 后往前 找第一個比temp小的數(shù)j--;if(i<j){A[i] = A[j];i++;}while(i<j && A[i]<temp){ 前往后 找第一個比temp大的數(shù)j++if(i<j){A[j] = A[i];j--;}}A[i] = temp; }設計一個算法,對給定的一個整型m×nm×nm×n矩陣A,統(tǒng)計這個矩陣中具有下列特征的元素個數(shù)并輸出它們的坐標及數(shù)值:它們既是所在行中的最小值,又是所在列中的最小值;或者它們既是所在行中的最大值,又是所在列中的最大值。假設矩陣中元素各不相同,要求結(jié)果在處理過程中用輸出語句輸出
三重循環(huán)
第一重 第二重:行最小
第三重:列最小
簡要介紹稀疏矩陣的三元組存儲結(jié)構(gòu)特點,并實現(xiàn)稀疏矩陣的基本操作。
給定稀疏矩陣A(int型),創(chuàng)建其三元組存儲結(jié)構(gòu)B
??三元組存儲結(jié)構(gòu)是一種順序結(jié)構(gòu),是順序表。表中每個結(jié)點對應稀疏矩陣的一個非零元素,其中包括3個字段,分別為該元素的值,行下標和列下標。
??用第0行的第1個元素存儲矩陣中非零元素的個數(shù),第0行的第2個元素存儲矩陣的行數(shù),第0行的第3個元素存儲矩陣的列數(shù)
查找給定元素x是否在矩陣中。
int search(int B[][3], int x){int i, t;t = B[0][0]; 非零元素個數(shù)i = 1;while(i<t && B[i][0]!=x){i++;}if(i<=t){return 1;}else{return 0;} }假設稀疏矩陣A采用三元組表示,編寫一個函數(shù),計算其轉(zhuǎn)置矩陣B,要求B也采用三元組表示。
兩重循環(huán) colSize×elemSizecolSize × elemSizecolSize×elemSize
void transpose(int A[][3], int B[][3]){B[0][0] = A[0][0];B[0][1] = A[0][2];B[0][2] = A[0][1];int index = 1;if(B[0][0]>0){for(int col = 0; col<B[0][1]; col++){for(int j = 1; j<=B[0][0]; j++){if(A[j][2] == col){B[index][0] = A[j][0];B[index][1] = A[j][2];B[index][2] = A[j][1];}}}} }假設稀疏矩陣A和B(兩矩陣行列數(shù)對應相等)都采用三元組表示,編寫一個函數(shù),計算C=A+B,要求C也采用三元組表示,所有矩陣均為int型。
注意 相加可能為0
void add(int A[][3], int B[][3], int C[][3]){int i=1, j=1, k=1, m;while(i<=A[0][0] && j<=B[0][0]){if(A[i][1] == B[j][1]){if(A[i][2] < B[j][2]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}else if(A[i][2] > B[j][2]){C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}else{m = A[i][0] + B[j][0];if(m!=0){C[k][0] = m;C[k][1] = A[j][1];C[k][2] = A[j][2];k++;}i++;j++;}}else if(A[i][1] < B[j][1]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}else{C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}}while(i<=A[0][0]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}while(j<=B[0][0]){C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}C[0][0] = k - 1;C[0][1] = A[0][1];C[0][2] = A[0][2]; }假設稀疏矩陣A和B(分別為m×nm×nm×n和n×kn×kn×k矩陣)采用三元組表示,編寫一個函數(shù),計算C=A×BC=A×BC=A×B,要求CCC也是采用三元組表示的稀疏矩陣。
int getValue(int D[][maxSize], int i, int j){int k = 1;while(k<=D[0][0] && (D[k][1] != i || D[k][2] != j))k++;if(k<=D[0][0])return D[k][0];elsereturn 0; } void mul(int A[][3], int B[][3], int C[][3], int m, int n, int k){int i, j, l, p=1, s;for(i = 0; i<m; i++){for(j = 0; j<k; j++){s = 0;for(l = 0; l<n; l++){s += getValue(A, i, l) * getValue(B, l, j);if(s != 0){C[p][0] = s;C[p][1] = i;C[p][2] = j;p++;}}}}C[0][0] = p-1;C[0][1] = m;C[0][2] = k; }總結(jié)
提示:這里對文章進行總結(jié):
總結(jié)
以上是生活随笔為你收集整理的天勤2022数据结构(四)数组、矩阵与广义表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在线文本代码对比
- 下一篇: MySQL练习题及答案(图书管理数据库)