采用二分查找(即折半查找)的方法实现查找
2016-11-29 14:34
239 查看
采用二分查找的方法实现查找
(1)定义顺序表的存储结构;
(2)实现顺序表上二分查找;
代码实现:
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<queue>
#include<malloc.h>//头文件包含malloc函数,用来申请内存空间
#include<algorithm>
#include<math.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define N 10 // 数据元素个数
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef int KeyType; // 设关键字域为整型
//数据元素的类型
struct ElemType
{
int key;
};
//静态查找表的顺序存储结构
struct SSTable
{
ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)
int length;//表的长度
};
//对于两个数值型变量的比较约定为如下的宏定义
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
//由n个数据元素的数组r,构造静态查找表ST
void Create_Seq(SSTable &ST, ElemType r[], int n)
{
int i;
//ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));//动态生成n+1个数据元素空间,0号单元不用
ST.elem = (ElemType*)malloc((n + 1)*sizeof(ElemType));
if (!ST.elem)
exit(ERROR);
for (i = 1; i <= n; i++)
ST.elem[i] = r[i - 1];//将数组的元素依次赋值给ST
ST.length = n;
}
void Ascend(SSTable &ST)//重建静态查找表为按照关键字为非降序排列
{
int i, j, k;
for (i = 1; i < ST.length; i++)
{
k = i;
ST.elem[0] = ST.elem[i];//待比较的元素存入0号单元
for (j = i + 1; j <= ST.length; j++)
{
if (LT(ST.elem[j].key, ST.elem[0].key))
{
k = j;
ST.elem[0] = ST.elem[j];
}
}
if (k != i)//有更小的值则交换
{
ST.elem[k] = ST.elem[i];
ST.elem[i] = ST.elem[0];
}
}
}
//在有序表ST中,折半查找关键字等于key的数据元素,返回在表中的位置(查找有序的顺序表)
int Search_Bin(SSTable &ST, long key)
{
int low, mid, high;
low = 1;
high = ST.length;//置区间初值
while (low <= high)
{
mid = (low + high) / 2;
if (EQ(ST.elem[mid].key, key))
return mid;
else if (LT(key, ST.elem[mid].key))
high = mid - 1;//继续在前半个区间查找
else
low = mid + 1;//继续在后半个区间查找
}
return 0;//没有查找到
}
//顺序表的有序查找
int main()
{
SSTable st;
int i,n;
int s;
ElemType r[50];
printf("请输入您所要查找的序列的元素个数:");
scanf("%d", &n);
printf("请按照从小到大的顺序输入各元素的值:");
for (int i = 0; i < n; i++) {
scanf("%d", &r[i]);
}
Create_Seq(st, r, n);//建立无序的顺序查找表
Ascend(st);//将无序的查找表重建为按照关键字非降序排列的查找表
printf("请输入你要查找值得关键字:");
scanf("%d", &s);
i = Search_Bin(st, s);
if (i)
printf("存在您要找的关键字%d,且是第%d个关键字\n", st.elem[i].key, i);
else
printf("不存在您要找的关键字!");
return 0;
}
执行结果:
相关文章推荐
- 十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找
- Java代码实现一维数组的二分查找(折半查找)(非递归方法)
- VB 中遍历目录,遍历目录查找文件的2个实现方法
- fck_editor 不采用正则表达式实现插入任意自定义图片标签的解决方法
- Java实现折半查找(二分查找)的递归和非递归算法
- 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
- C#实现字符串按多个字符采用Split方法分割
- QQ2004的Rich句柄查找方法以及尾巴病毒的实现
- C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考
- 关于23D 采用EMI接口实现16位的LCD接口的一种方法
- 两种方法实现类似微博好友查找的道指令程序
- 如何C#中实现在TreeView查找某一节点(两种方法)
- essential c++ 基于第二章的内容采用面向过程的方法实现猜字游戏的基本实现代码
- 最近在做项目过程要实现Gridview 表头固定 ,采用了以下方法。
- java实现常用的查找(线性查找,折半查找)
- 模式探索(1):采用委托实现模版方法
- 如何C#中实现在TreeView查找某一节点(两种方法)
- List 采用delegate快速实现排序、查找等操作
- 如何C#中实现在TreeView查找某一节点(两种方法)
- C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考