杨氏矩阵:矩阵的每行每列元素都是满足有序的,存在一些位置为空,设置为无穷大,设计提取矩阵中最小值,插入一个元素,查找元素,对矩阵中所有元素进行排序
#include<iostream>
using namespace std;
const int infinity=10000;
void maintain(int ** a, int i, int j, int m, int n);
int extract_min(int **a, int m, int n)
{
if(a[0][0]==infinity)
return a[0][0];
int min=a[0][0];
maintain(a, 0,0, m, n);
return min;
}
void maintain(int **a, int i, int j, int m, int n)
{
if(i==m-1 && j==n-1)
return ;
int mini=i, minj=j;
a[mini][minj]=infinity;
if(j+1<=n-1)
{
mini=i;
minj=j+1;
}
if(i+1<=m-1 && a[i+1][j]<a[mini][minj])
{
mini=i+1;
minj=j;
}
if(mini!=i || minj!=j)
{
a[i][j]=a[mini][minj];
a[mini][minj]=infinity;
maintain(a, mini, minj, m ,n);
}
}
void maintain1(int **a, int i, int j, int m, int n)
{
if(i==0 && j==0)
return ;
int mini=i, minj=j;
//a[mini][minj]=infinity;
if(j-1>=0&&a[i][j-1]>a[mini][minj])
{
mini=i;
minj=j-1;
}
if(i-1>=0 && a[i-1][j]>a[mini][minj])
{
mini=i-1;
minj=j;
}
if(mini!=i || minj!=j)
{
int temp;
temp=a[i][j];
a[i][j]=a[mini][minj];
a[mini][minj]=temp;
maintain1(a, mini, minj, m ,n);
}
}
void insert(int **a, int value, int m ,int n)
{
if(a[m-1][n-1]!=infinity)
return;
a[m-1][n-1]=value;
maintain1(a, m-1,n-1,m,n);
}
void sort(int **a, int m, int n)
{
int i,j;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
cout<<a[0][0]<<endl;
a[0][0]=infinity;
maintain(a,0,0,m,n);
}
}
int main()
{
srand((int)time(0));
int m=4, n=4;
int a[4][4]={{2, 3, 4, infinity}, {5, 8, 9, infinity}, {12, 14, 16, infinity}, {infinity, infinity, infinity, infinity}};
int i,j;
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<a[i][j]<<",";
cout<<endl;
}
int *b[]={a[0],a[1],a[2],a[3]};
extract_min(b, m, n);
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<b[i][j]<<",";
cout<<endl;
}
insert(b,10,m,n);
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<b[i][j]<<",";
cout<<endl;
}
sort(b,m,n);
return 0;
}