现在的位置: 首页 > 综合 > 正文

杨氏矩阵

2013年10月13日 ⁄ 综合 ⁄ 共 875字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.