具体结构介绍可以参考《算法导论》第六章,课后习题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;
}