具体结构介绍可以参考《算法导论》第六章,课后习题6-3.杨氏矩阵操作有的时候有点像二叉搜索树,有的时候类似堆排序,操作:
#include <iostream> #include <algorithm> using namespace std; #include<iostream> #include<algorithm> using namespace std; #define m 4 #define n 5 void findk(int (*a)[n],int key) { for (int i=m-1,int j=0;i>=0&&j!=n;) { if(a[i][j]==key) { cout<<key<<"存在!"<<endl; if(i==0) ++j; else if(j==n-1) --i; else --i; } else if(a[i][j]<key) { ++j; }else if(a[i][j]>key) { --i; } } //杨氏矩阵:算法导论课后题6-3,当找其中的某一个键值的时候,从最左下角开始进行查找,这样的话 //该最左下角右边一个比他大,左边一个比他小,就可以像二叉查找树一样操作; } void insert(int (*a)[n],int key,int x,int y)//插入key,地方x,y { int i=x; int j=y; a[i][j]=key; int xlarge; int ylarge; if (i>=0&&j>=0) { if(a[i-1][j]>a[i][j]) { xlarge=i-1; ylarge=j; }else { xlarge=i; ylarge=j; } if (a[i][j-1]>a[i][j]) { xlarge=i; ylarge=j-1; } if (xlarge!=i||ylarge!=j) { swap(a[xlarge][ylarge],a[i][j]); insert(a,key,xlarge,ylarge); } } } int main() { int a[m][n]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7,4,5,6,7}; findk(a,5); insert(a,8,3,4); return 0; }