young tableau(杨氏矩阵)

杨氏矩阵:矩阵的每行每列元素都是满足有序的,存在一些位置为空,设置为无穷大,设计提取矩阵中最小值,插入一个元素,查找元素,对矩阵中所有元素进行排序

#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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值