天勤2022数据结构(四)数组、矩阵与广义表
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、綜合應用題
- 總結
前言
提示:這里可以添加本文要記錄的大概內容:
提示:以下是本篇文章正文內容,下面案例可供參考
一、綜合應用題
設數組A[0,…,n-1]的n個元素中有多個零元素,設計一個算法,將A中所有的非零元素依次移動到A數組的前端
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;}}} }關于浮點型數組 A[0,…,n-1],試設計實現下列運算的遞歸算法
-
求數組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); } -
求數組中n個數之和
float sum(float A[], int i, int j){if(i == j){return A[i];}return A[i] + sum(A[i], i+1, j); } -
求數組中n個數的平均值
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); }
試設計一個算法,將數組 A[0,…,n-1]中 所有奇數移到偶數之前。要求不另增加存儲空間,且時間復雜度為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){ 找第一個偶數i++;}while(i<j && A[j]%2 == 0){ 找最后一個奇數j--;}if(i<j){temp = A{i];A[i] = A{j];A[j] = temp;i++;j--;}} }設有一元素為整數的線性表L,存放在一維數組A[0,…,n-1]中,設計一個算法,以A[n-1]為參考量,將該 數組分為左右兩個部分 ,其中左半部分的元素值均小于等于A[n-1],右半部分的元素值均大于A[n-1],A[n-1]則位于這兩部分之間要求結果仍存放在數組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小的數j--;if(i<j){A[i] = A[j];i++;}while(i<j && A[i]<temp){ 前往后 找第一個比temp大的數j++if(i<j){A[j] = A[i];j--;}}A[i] = temp; }設計一個算法,對給定的一個整型m×nm×nm×n矩陣A,統計這個矩陣中具有下列特征的元素個數并輸出它們的坐標及數值:它們既是所在行中的最小值,又是所在列中的最小值;或者它們既是所在行中的最大值,又是所在列中的最大值。假設矩陣中元素各不相同,要求結果在處理過程中用輸出語句輸出
三重循環
第一重 第二重:行最小
第三重:列最小
簡要介紹稀疏矩陣的三元組存儲結構特點,并實現稀疏矩陣的基本操作。
給定稀疏矩陣A(int型),創建其三元組存儲結構B
??三元組存儲結構是一種順序結構,是順序表。表中每個結點對應稀疏矩陣的一個非零元素,其中包括3個字段,分別為該元素的值,行下標和列下標。
??用第0行的第1個元素存儲矩陣中非零元素的個數,第0行的第2個元素存儲矩陣的行數,第0行的第3個元素存儲矩陣的列數
查找給定元素x是否在矩陣中。
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;} }假設稀疏矩陣A采用三元組表示,編寫一個函數,計算其轉置矩陣B,要求B也采用三元組表示。
兩重循環 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(兩矩陣行列數對應相等)都采用三元組表示,編寫一個函數,計算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矩陣)采用三元組表示,編寫一個函數,計算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; }總結
提示:這里對文章進行總結:
總結
以上是生活随笔為你收集整理的天勤2022数据结构(四)数组、矩阵与广义表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在线文本代码对比
- 下一篇: 反激电源基本原理和简单的使用例程 学习笔