编程珠玑第十三章----查找

1、顺序查找

int find1(int *array,int n,int val)
{
	if (n<=0)
	{
		return -1;
	}

	for (int i=0;i<n;i++)
	{
		if (val==array[i])
		{
			return i;
		}
	}

	return -1;
}

2、二分查找

int find2(int *array,int n,int val)
{
	if (n<=0)
	{
		return -1;
	}

	int begin=0,end=n-1,mid;
	while(begin<=end)            
	{
		mid=(begin+end)/2;
		if (array[mid]==val)
			return mid;
		else if(array[mid]>val)
			end=mid-1;
		else
			begin=mid+1;
	}

	return -1;
}

3、二叉查找树

//二叉查找树数据结构
typedef struct Btree 
{
	int data;
	Btree *left;
	Btree *right;
}*PBTree;

//创建二叉查找树,返回树的根节点
PBTree CreateBTree(int *array,int n)
{
	PBTree root=new Btree;
	root->data=array[0];
	root->left=NULL;
	root->right=NULL;

	PBTree current,back,pNew;
	for (int i=1;i<n;i++)
	{
		pNew=new Btree;
		pNew->data=array[i];
		pNew->left=pNew->right=NULL;
		current=root;
		while(current!=NULL)   //找到合适的插入位置
		{
			back=current;
			if(current->data>array[i])
				current=current->left;
			else
				current=current->right;
		}
		if(back->data>array[i])
			back->left=pNew;
		else
			back->right=pNew;
	}

	return root;
}

//利用二叉查找树进行递归查找
bool find3(PBTree root,int val)
{
	if (root==NULL)
		return false;
	if (root->data==val)
		return true;
	else if(root->data>val)
		return find3(root->left,val);
	else
		return find3(root->right,val);
}

4、哈希查找(除留取余法+链式法)

#define MAX 10
        
//链表数据结构
typedef struct list  
{
	int data;
	list *next;
}*pList;

list hashtable[MAX];  ///链式法解决地址冲突,MAX个带头节点的hash链表

//除留取余法
int hashFunc(int n)   
{
	return n%MAX;
}

//创建hash链表
void createhash(int *array,int n)  
{
	pList p,pNew;
	for (int i=0;i<n;i++)
	{
		pNew=new list;
		pNew->data=array[i];
		pNew->next=NULL;
		
		int pos=hashFunc(array[i]);
		p=hashtable[pos].next;
		
		if (p!=NULL)         //将新的节点插入到头结点的后面
		{
			pNew->next=p;
			hashtable[pos].next=pNew;
		} 
		else
		{
			hashtable[pos].next=pNew;
		}
	}
}

//hash查找
bool SearchHash(int val)   
{
	int pos=hashFunc(val);        //找出在哪个hash链表
	pList p=hashtable[pos].next;  //遍历对应的链表
	while(p!=NULL)
	{
		if(p->data==val)
			return true;
		p=p->next;
	}
	
	return false;
}

//遍历hashtable
void TraverseHashtable()
{
	for (int m=0;m<MAX;m++) //一次遍历每个链表里面的内容
	{
		pList p1=hashtable[m].next;
		while(p1!=NULL)
		{
			cout<<p1->data<<" ";
			p1=p1->next;
		}
	}
	cout<<endl;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 编 程 技 术 第1章 性能监视工具 3 1.1 计算素数 3 1.2 使用性能监视工具 7 1.3 一个专用的性能监视工具 8 1.4 开发性能监视工具 10 1.5 原理 11 1.6 习题 11 1.7 深入阅读 12 第2章 关联数组 13 2.1 Awk中的关联数组 13 2.2 有穷状态机模拟器 16 2.3 拓扑排序 17 2.4 原理 20 2.5 习题 21 2.6 深入阅读 22 第3章 程序员的忏悔 23 3.1 二分搜索 24 3.2 选择算法 26 3.3 子程序库 28 3.4 原理 30 3.5 习题 31 第4章 自描述数据 33 4.1 名字—值对 33 4.2 记录来历 36 4.3 排序实验 37 4.4 原理 39 4.5 习题 39 第二部分 实 用 技 巧 第5章 劈开戈尔迪之结 43 5.1 小测验 43 5.2 解答 44 5.3 提示 44 5.4 原理 47 5.5 习题 48 5.6 深入阅读 49 5.7 调试(边栏) 49 第6章 计算机科学箴言集 51 6.1 编码 52 6.2 用户界面 53 6.3 调试 53 6.4 性能 54 6.5 文档 56 6.6 软件管理 56 6.7 其他 58 6.8 原理 58 6.9 习题 58 6.10 深入阅读 60 第7章 粗略估算 61 7.1 头脑热身 61 7.2 性能的经验法则 62 7.3 Little定律 64 7.4 原理 65 7.5 习题 66 7.6 深入阅读 67 7.7 日常速算(边栏) 67 第8章 人员备忘录 69 8.1 备忘录 69 8.2 原理 71 8.3 深入阅读 71 第三部分 人性化I/O 第9章 小语言 75 9.1 Pic语言 76 9.2 视角 79 9.3 Pic预处理器 81 9.4 用来实现Pic的小语言 83 9.5 原理 87 9.6 习题 88 9.7 深入阅读 89 第10章 文档设计 91 10.1 表格 92 10.2 三条设计原则 94 10.3 插图 94 10.4 文本 96 10.5 合适的媒介 98 10.6 原理 100 10.7 习题 101 10.8 深入阅读 101 10.9 次要问题目录(边栏) 101 第11章 图形化输出 103 11.1 实例研究 103 11.2 显示结果取样 105 11.3 原理 107 11.4 习题 108 11.5 深入阅读 110 11.6 拿破仑远征莫斯科(边栏) 110 第12章 对调查的研究 113 12.1 有关民意调查的问题 113 12.2 语言 114 12.3 图片 117 12.4 原理 119 12.5 习题 120 第四部分 算 法 第13章 绝妙的取样 123 13.1 取样算法一瞥 123 13.2 Floyd算法 124 13.3 随机排列 125 13.4 原理 127 13.5 习题 127 13.6 深入阅读 128 第14章 编写数值计算程序 129 14.1 问题 129 14.2 牛顿迭代 130 14.3 良好的起点 132 14.4 代码 133 14.5 原理 135 14.6 习题 135 14.7 深入阅读 137 14.8 数值算法的力量(边栏) 137 第15章 选择 141 15.1 问题 141 15.2 程序 142 15.3 运行时间分析 145 15.4 原理 148 15.5 习题 149 15.6 深入阅读 151 附录A C和Awk语言 153 附录B 一个子程序库 157 部分习题答案 165 索引 181

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值