#include <stdio.h>
#include <limits.h>
#define LEN 4
int YExtractMin(int a[LEN][LEN])
{
int r=a[0][0];
a[0][0]=INT_MAX;
int i=0,j=0,temp;
bool flag=false;
while(i+1<LEN || j+1<LEN)
{
flag=false;
if(i+1<LEN && j+1<LEN)
{
if(a[i+1][j]<a[i][j] && a[i+1][j]<a[i][j+1])
{
temp=a[i+1][j];
a[i+1][j]=a[i][j];
a[i][j]=temp;
i=i+1;
flag=true;
}
if(a[i][j+1]<a[i][j] && a[i][j+1]<a[i+1][j])
{
temp=a[i][j+1];
a[i][j+1]=a[i][j];
a[i][j]=temp;
j=j+1;
flag=true;
}
}
else
{
if(i+1<LEN)
{
if(a[i+1][j]<a[i][j])
{
temp=a[i+1][j];
a[i+1][j]=a[i][j];
a[i][j]=temp;
i=i+1;
flag=true;
}
}
else
{
if(a[i][j+1]<a[i][j])
{
temp=a[i][j+1];
a[i][j+1]=a[i][j];
a[i][j]=temp;
j=j+1;
flag=true;
}
}
}
if(!flag)
{
break;
}
}
return r;
}
void decreaseKey(int a[LEN][LEN],int key,int i,int j)
{
if(key>a[i][j])
{
printf("新键必须小于原键!");
return;
}
a[i][j]=key;
bool flag=false;
int temp;
while(i-1>=0 || j-1>=0)
{
flag=false;
if(i-1>=0 && j-1>=0)
{
if(a[i-1][j]>a[i][j] || a[i][j-1]>a[i][j])
{
if(a[i-1][j]>a[i][j-1])
{
temp=a[i][j];
a[i][j]=a[i-1][j];
a[i-1][j]=temp;
i--;
flag=true;
}
else
{
temp=a[i][j];
a[i][j]=a[i][j-1];
a[i][j-1]=temp;
j--;
flag=true;
}
}
}
else if(i-1>=0)
{
if(a[i-1][j]>a[i][j])
{
temp=a[i][j];
a[i][j]=a[i-1][j];
a[i-1][j]=temp;
i--;
flag=true;
}
}
else
{
if(a[i][j-1]>a[i][j])
{
temp=a[i][j];
a[i][j]=a[i][j-1];
a[i][j-1]=temp;
j--;
flag=true;
}
}
if(!flag)
{
break;
}
}
}
void printA(int a[LEN][LEN])
{
for(int i=0;i<LEN;i++)
{
for(int j=0;j<LEN;j++)
{
if(a[i][j]<INT_MAX)
printf("%d ",a[i][j]);
else
printf("* ");
}
printf("\n");
}
}
void Yinsert(int a[LEN][LEN],int key)
{
decreaseKey(a,key,LEN-1,LEN-1);
}
void Ysort(int a[LEN][LEN])
{
int t;
do
{
t=YExtractMin(a);
if(t!=INT_MAX)
printf("%d ",t);
}while(t!=INT_MAX);
}
bool YfindKey(int a[LEN][LEN],int key)
{
int t=YExtractMin(a);
while( t != INT_MAX)
{
if(t==key)
return true;
if(t>key)
{
return false;
}
t=YExtractMin(a);
}
}
void main()
{
int a[LEN][LEN]={{2,3,4,5},{8,9,12,14},{16,INT_MAX,INT_MAX,INT_MAX},{INT_MAX,INT_MAX,INT_MAX,INT_MAX}};
//YExtractMin(a);
//decreaseKey(a,1,1,3);
Yinsert(a,1);
printA(a);
//Ysort(a);
bool b=YfindKey(a,5);
printf("%d",b);
getchar();
}算法导论 思考题 6-3 c,d,e小题
最新推荐文章于 2020-08-27 23:46:07 发布
本文介绍了一个基于二维数组的最小元素提取方法,并实现了排序、插入和查找等功能。通过定义特定的操作如 YExtractMin、decreaseKey 和 Ysort 等,该文详细展示了如何在二维数组中进行这些操作的具体实现。
4000

被折叠的 条评论
为什么被折叠?



