一、项目背景详细介绍
在算法与数据结构学习过程中,特殊矩阵结构是一类非常重要但又容易被忽视的内容。常见的如对称矩阵、稀疏矩阵、上三角矩阵等,而杨氏矩阵(Young Matrix,又称杨氏表、Young Tableau)则属于一种有序矩阵结构,在查找、排序、堆思想理解等方面具有极高的教学价值。
杨氏矩阵最早源于组合数学中的 Young Tableaux,但在计算机科学中,通常指满足以下性质的二维矩阵:
每一行从左到右递增
每一列从上到下递增
这种矩阵结构在算法题中非常常见,尤其用于:
二维有序数据的快速查找
理解“从右上角或左下角开始搜索”的思想
为后续学习二维搜索、堆的推广、矩阵算法打基础
在初学 C 语言或数据结构阶段,引入一个3×3 的杨氏矩阵,可以:
降低理解难度
清晰演示矩阵性质
便于手算与调试
非常适合课堂与博客教学
因此,本项目的目标是:
使用 C 语言完整实现一个 3×3 的杨氏矩阵,并演示其核心操作 —— 查找元素。
二、项目需求详细介绍
本项目围绕3×3 杨氏矩阵,具体需求如下:
1️⃣ 基本矩阵要求
使用一个3 行 3 列的二维数组
矩阵满足:
行递增
列递增
示例矩阵(合法的杨氏矩阵):
1 4 7 2 5 8 3 6 9
2️⃣ 功能需求
(1)初始化杨氏矩阵
在程序中定义并初始化一个合法的 3×3 杨氏矩阵
所有元素为整数
(2)打印矩阵
以行列形式清晰输出矩阵内容
方便观察矩阵结构
(3)在杨氏矩阵中查找指定元素
给定一个整数
key判断该元素是否存在于矩阵中
若存在:
输出其行号与列号
若不存在:
给出明确提示
(4)查找算法要求
不得暴力遍历整个矩阵
必须利用杨氏矩阵“行列递增”的特性
时间复杂度优于 O(n²)
三、相关技术详细介绍
1️⃣ 二维数组(C 语言)
在 C 语言中,二维数组的本质是:
int arr[3][3];
行优先存储
可通过
arr[i][j]访问元素非常适合表示矩阵结构
2️⃣ 杨氏矩阵的核心性质
杨氏矩阵满足两个关键条件:
行递增
对于任意一行:arr[i][0] < arr[i][1] < arr[i][2]列递增
对于任意一列:arr[0][j] < arr[1][j] < arr[2][j]
3️⃣ 杨氏矩阵的查找思想(重点)
为什么不能随便从某个位置找?
如果从左上角开始:
只能确定右边更大
下边更大
无法判断往哪走
正确的查找起点
👉右上角(0, cols-1)或左下角(rows-1, 0)
以右上角为例:
当前值 > key → 向左移动
当前值 < key → 向下移动
相等 → 找到
这样每一步都能排除一整行或一整列
时间复杂度:
O(行数 + 列数)
对于 3×3,即最多 6 步
四、实现思路详细介绍
1️⃣ 总体思路
定义一个 3×3 的二维数组作为杨氏矩阵
编写函数打印矩阵
编写函数在杨氏矩阵中查找元素
在
main函数中:调用打印函数
查找多个示例数据
验证结果
2️⃣ 查找算法流程(右上角法)
假设当前位置(row, col):
初始位置:
row = 0 col = 2循环条件:
row < 3 && col >= 0比较:
若
arr[row][col] == key→ 找到若
arr[row][col] > key→col--若
arr[row][col] < key→row++
循环结束仍未找到 → 不存在
五、完整实现代码
#include <stdio.h> /* =============================== 功能:打印 3x3 杨氏矩阵 =============================== */ void printMatrix(int matrix[3][3]) { int i, j; printf("当前杨氏矩阵内容:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%3d ", matrix[i][j]); } printf("\n"); } } /* ========================================= 功能:在 3x3 杨氏矩阵中查找指定元素 参数: matrix - 杨氏矩阵 key - 要查找的值 返回: 找到返回 1,未找到返回 0 ========================================= */ int findInYoungMatrix(int matrix[3][3], int key) { int row = 0; // 从右上角开始 int col = 2; while (row < 3 && col >= 0) { if (matrix[row][col] == key) { printf("找到元素 %d,位置为:(%d, %d)\n", key, row, col); return 1; } else if (matrix[row][col] > key) { col--; // 当前值过大,向左移动 } else { row++; // 当前值过小,向下移动 } } printf("未找到元素 %d\n", key); return 0; } /* =============================== 主函数 =============================== */ int main() { /* 定义并初始化一个合法的 3x3 杨氏矩阵 */ int youngMatrix[3][3] = { {1, 4, 7}, {2, 5, 8}, {3, 6, 9} }; printMatrix(youngMatrix); printf("\n查找示例:\n"); findInYoungMatrix(youngMatrix, 5); findInYoungMatrix(youngMatrix, 6); findInYoungMatrix(youngMatrix, 10); return 0; }六、代码详细解读
1️⃣printMatrix
用于输出 3×3 杨氏矩阵
双重循环逐行逐列打印
帮助直观观察矩阵结构
2️⃣findInYoungMatrix
利用杨氏矩阵“行列递增”特性
从右上角开始查找
每一步都能排除一行或一列
查找效率远高于暴力遍历
3️⃣main
初始化一个标准的 3×3 杨氏矩阵
测试多种查找情况:
存在的元素
不存在的元素
验证算法正确性
七、项目详细总结
通过本项目,我们完成了:
✅ 使用 C 语言构建 3×3 杨氏矩阵
✅ 深入理解杨氏矩阵的结构特点
✅ 掌握二维有序矩阵的高效查找算法
✅ 为后续学习二维搜索、矩阵算法、堆结构打下基础
3×3 的规模虽小,但思想非常重要,是从“一维有序”迈向“二维有序”的关键一步。
八、项目常见问题及解答
Q1:为什么一定从右上角开始?
因为右上角元素:
左边都比它小
下边都比它大
可以一次性排除一整行或一整列
Q2:能从左下角开始吗?
可以,逻辑完全对称:
当前值 > key → 向上
当前值 < key → 向右
Q3:这是二分查找吗?
不是。
这是二维有序矩阵查找算法,思想类似二分,但不是真正的二分查找。
九、扩展方向与性能优化
1️⃣ 将 3×3 扩展为n×m 杨氏矩阵
2️⃣ 封装成通用库函数
3️⃣ 支持动态输入矩阵
4️⃣ 结合算法题(如 LeetCode / 剑指 Offer)
5️⃣ 探索杨氏矩阵与堆结构的联系