当前位置:文档之家› C++ 实现顺序查找算法

C++ 实现顺序查找算法

C++ 实现顺序查找算法
C++ 实现顺序查找算法

实验4 顺序查找算法实现实验

一. 实验目的

1.学生在实习中体会各种查找算法的基本思想、适用场合,理解开发高效算法的可能性和寻找、构造高效算法的方法。

2.掌握运用查找解决一些实际应用问题。

二. 实验内容

用C++描述并实现主要查找算法及其主要操作,其逻辑结构

参阅教科书P271/中文版P224。实现要求如下:

1)实现顺序查找算法,(参考程序如下)

#include

using namespace std;

typedef int KeyType; // 关键字的类型

const int MAXSIZE=100; // 数组的容量

struct ElemType //学生的记录信息

{ KeyType key ; //学号

char name[10]; //姓名

int english; //成绩

int math; //成绩

} ;

class List

{ public:

ElemType *ht; //表数组

int length; //表大小(长度)

//KeyType p; // 除留余数法的大质数

public:

List( int n1,int p1);

~List(){delete ht[]; length=0;};

//int find( KeyType k );

int search( KeyType k );

//void creat_hash();

void PrintOut();

};

//------------------------------------------------------------- List::List(int n1,int p1)

{ int num=0;

length=n1; p=p1;

ht=new ElemType[length];

for(int i=0;i

}

void List::creat_hash()

{ int i,j,K,en,ma;char na[10];

cout<<"\n 请逐一输入各个学号(关键字值)(-1结束):"; cin>>K;

while(K!=-1&&num

{

cout<<"\n 请输入学生的姓名,英语成绩和高数成绩:";

cin>>na>>en>>ma;

ht[i].key=K;

strcpy(ht[i].name,na); //用串拷贝赋值

ht[i].english=en;

ht[i].math=ma; // 插入学生记录K

cout<<"\n 插入成功!" ; num++;

cout<<"\n 请逐一输入各个学号(关键字值)(-1结束):"; cin>>K;

}

}

//查询某关键字的记录

int List::search( KeyType k )

{ for(i=0;i

{ if(K==ht[i].key)

return i;

}

}

void List::PrintOut()

{ int i,j;

for (i=0;i

{

if(ht[i].key!=-1)

cout<<"\n i="<

"<

<<" 英语成绩:"<

}

int main()

{ int p0,n0;

cout<<"\n 请输入n值(n值应是记录总数的.3-1.5倍)"; cin>>n0; cout<<"\n 请输入P值(应是不大于n 的大质数):"; cin>>p0;

List ha(n0,p0); ElemType a;

int k; char ch;

do { cout<<"\n\n\n";

cout<<"\n 1. 建立哈希表 ";

cout<<"\n 2. 在哈希表中查找某位学生";

cout<<"\n 3. 输出哈希表";

cout<<"\n 4. 结束";

cout<<"\n=======================================";

cout<<"\n 输入您的选择(1,2,3,4):"; cin>>k;

switch(k)

{ case 1:{ ha.creat_hash();

} break;

case 2:{ cout<<"\n 请输入待查找的学生学号:"; cin>>a.key;

int i=ha.search(a.key);

if(i==-1)

cout<<"\n 此学生"<

else

cout<<"\n i="<

<<" 英语成绩:"<

} break;

case 3:{ ha.PrintOut(); } break;

}

}while(k>=1&&k<=3);

getchar(); return 0;

}

3、实验结果

4、总结:

1.顺序查找法就如同数组的遍历,从数组的第一个元素开始,检查数组的每一个元素,以便确定是否有查找的数据。由于是从头检查到尾,所以数组数据是否已经排序已经不重要。

2.动手实践,动脑思考,理论知识要结合熟练操作,这

样学习才会记忆深刻。

有序顺序表的二分查找的递归算法

有序顺序表的二分查找的递归算法。 #include #include #include #include #include using namespace std; #define maxsize 100 #define overflow -2 typedef int ElemType; typedef int Status; typedef struct SqList { ElemType *elem; int length; }SqList; int Search(SqList l, ElemType key, int low, int high) { int mid; if(low > high) return -1; else { mid = (low+high)/2; if(l.elem[mid] == key) return mid; if(l.elem[mid] > key) return Search(l, key, low, mid-1); else return Search(l, key, mid+1, high); } } void InitList_Sq(SqList &l){ int len;

int data; l.elem=(ElemType *)malloc(l.length*sizeof( ElemType)); if(!l.elem)exit(overflow); cout<<"请输入顺序表的长度: "; cin>>len; l.length=len; cout<<"请输入顺序表的数据:"<

C语言 顺序查找和折半查找

C语言顺序查找、折半查找#include #include typedefstruct dui{ char data; struct dui *next; }linkqueue; char temp; voidinit_LIST(linkqueue *LIST) { LIST->next=NULL; } intlen_LIST(linkqueue *LIST) { int i=0; linkqueue *p; p=LIST->next; while(p!=NULL) { p=p->next; i++; } return i; } voidprint_LIST(linkqueue *LIST) { linkqueue *p; p=LIST->next; while(p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); intlen=len_LIST(LIST); printf("长度为%d\n",len); }

voidcreat_LIST(linkqueue *LIST) { char x; linkqueue *p,*s; s=LIST; while((x=getchar())!='#') { p=(linkqueue *)malloc(sizeof(linkqueue)); p->data=x; p->next=NULL; s->next=p; s=p; } printf("您创建的列表是:"); print_LIST(LIST); } voidshunxu(linkqueue *LIST) { int i=0,k=1; printf("输入您要查找的元素:"); getchar(); temp=getchar(); linkqueue *p; p=LIST->next; for(;p!=NULL;p=p->next) { i++; if(p->data==temp) {printf("####顺序查找####\n您要查找的元素在第%d位,比较了%d次\n",i,i); k=0;break;} } if(k) printf("####顺序查找####\n您要查找的元素不存在。\n"); } voidzheban(linkqueue *LIST) { intlen=len_LIST(LIST); linkqueue *s; s=LIST->next; int a[100]; for(int i=0;i

顺序查找法适用于存储结构为顺序或链接存储的线行表

一判断题 1.顺序查找法适用于存储结构为顺序或链接存储的线行表。 2.一个广义表可以为其他广义表所共享。 3.快速排序是选择排序的算法。 4.完全二叉树的某结点若无左子树,则它必是叶子结点。 5.最小代价生成树是唯一的。 6.哈希表的结点中只包含数据元素自身的信息,不包含任何指针。 7.存放在磁盘,磁带上的文件,即可意识顺序文件,也可以是索引文件。8.折半查找法的查找速度一定比顺序查找法快。 二选择题 1.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。 A. n B. 2n-1 C. 2n D. n-1 2.在文件"局部有序"或文件长度较小的情况下,最佳内部排序的方法是()。 A. 直接插入排序 B.气泡排序 C. 简单选择排序 D. 快速排序 3.高度为K的二叉树最的结点数为()。 A. 2 4.一个栈的输入序列是12345,则占的不可能的输出序列是() A.54321 B. 45321 C.43512 D.12345 5.ISAM文件和V ASM文件属于() A索引非顺序文件 B. 索引顺序文件 C. 顺序文件 D. 散列文件 6. 任何一棵二叉树的叶子结点在先序,中序和后序遍历序列中的相对次序() A. 不发生变化 B. 发生变化 C. 不能确定 D. 以上都不对 7.已知某二叉树的后序遍历序列是dabec, 中序遍历序列是debac , 它的前序遍历是()。 A. acbed B. decab C. deabc D.cedba 三.填空题 1.将下图二叉树按中序线索化,结点的右指针指向(),Y的左指针指向() B D C X E Y 2.一棵树T中,包括一个度为1的结点,两个度为2的结点,三个度为3的结点,四各度为4的结点和若干叶子结点,则T的叶结点数为()

数据结构顺序表的查找插入与删除

一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i); CreateList(&L,n); /*建立顺序表*/ PrintList(L,n); /*打印顺序表*/ printf("输入要查找的值:"); scanf("%d",&x); i=LocateList(L,x); /*顺序表查找*/ printf("输入要插入的位置:"); scanf("%d",&i); printf("输入要插入的元素:"); scanf("%d",&x); InsertList(&L,x,i); /*顺序表插入*/

实现顺序表各种基本运算的算法

实现顺序表各种基本运算的算法 要求:编写一个程序(algo2_1.cpp)实现顺序表的各种基本操作,并在此基础上设计一个主程序(exp2_1.cpp)完成如下功能: (1)初始化顺序表L (2)依次采用尾插法插入a,b,c,d,e元素 (3)输出顺序表L (4)输出顺序表L的长度 (5)判断顺序表L是否为空 (6)输出顺序表L的第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入f元素 (9)输出顺序表L (10)删除L的第3个元素 (11)输出顺序表L (12)释放顺序表L /*文件名:exp2-1.cpp*/ #include #include #define MaxSize 50 typedef char ElemType; typedef struct { ElemType elem[MaxSize]; int length; } SqList; extern void InitList(SqList *&L); extern void DestroyList(SqList *L); extern int ListEmpty(SqList *L); extern int ListLength(SqList *L); extern void DispList(SqList *L); extern int GetElem(SqList *L,int i,ElemType &e); extern int LocateElem(SqList *L, ElemType e); extern int ListInsert(SqList *&L,int i,ElemType e); extern int ListDelete(SqList *&L,int i,ElemType &e); void main() { SqList *L; ElemType e; printf("(1)初始化顺序表L\n"); InitList(L); printf("(2)依次采用尾插法插入a,b,c,d,e元素\n"); ListInsert(L,1,'a'); ListInsert(L,2,'b');

实验报告一顺序表的操作

《数据结构》实验报告一 系别:班级: 学号:姓名: 日期:指导教师: 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 从键盘输入10个整数,产生顺序表,并输入结点值。 从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 三、源程序及注释:

#include <> /*顺序表的定义:*/ #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; /*子函数的声明*/ void CreateList(SeqList * L,int n); /*创建顺序表函数*/ int LocateList(SeqList L,DataType x); /*查找顺序表*/ void InsertList(SeqList * L,DataType x,int i); /*在顺序表中插入结点x*/ void DeleteList(SeqList * L,int i);/*在顺序表中删除第i个结点*/ void PrintList(SeqList L,int n); /*打印顺序表中前n个结点*/ void main() { SeqList L; int n=10,x,i; /*欲建立的顺序表长度*/ =0;

各种查找算法的性能比较测试(顺序查找、二分查找)

算法设计与分析各种查找算法的性能测试

目录 摘要 (3) 第一章:简介(Introduction) (4) 1.1 算法背景 (4) 第二章:算法定义(Algorithm Specification) (4) 2.1 数据结构 (4) 2.2顺序查找法的伪代码 (5) 2.3 二分查找(递归)法的伪代码 (5) 2.4 二分查找(非递归)法的伪代码 (6) 第三章:测试结果(Testing Results) (8) 3.1 测试案例表 (8) 3.2 散点图 (9) 第四章:分析和讨论 (11) 4.1 顺序查找 (11) 4.1.1 基本原理 (11) 4.2.2 时间复杂度分析 (11) 4.2.3优缺点 (11) 4.2.4该进的方法 (12) 4.2 二分查找(递归与非递归) (12) 4.2.1 基本原理 (12) 4.2.2 时间复杂度分析 (13) 4.2.3优缺点 (13) 4.2.4 改进的方法 (13) 附录:源代码(基于C语言的) (15) 声明 ................................................................................................................ 错误!未定义书签。

摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归)

编程基础之顺序查找

01:查找特定的值 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。 输入 第一行包含一个正整数n,表示序列中元素个数。1 <= n <= 10000。 第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。 第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。 输出 若序列中存在x,输出x第一次出现的下标;否则输出-1。 5 2 3 6 7 3 3 2

02:输出最高分数的学生姓名 查看 描述 输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。 输入 第一行输入一个正整数N(N <= 100),表示学生人数。接着输入N行,每行格式如下: 分数姓名 分数是一个非负整数,且小于等于100; 姓名为一个连续的字符串,中间没有空格,长度不超过20。 数据保证最高分只有一位同学。 输出 获得最高分数同学的姓名。 5 87 lilei 99 hanmeimei 97 lily 96 lucy 77 jim hanmeimei 来源 习题(13-1)

03:不高兴的津津 查看 描述 津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。 请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。 输入 包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。 输出 包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。 5 3 6 2 7 2 5 3 5 4 0 4 0 6 3

数据结构实现顺序表的各种基本运算(20210215233821)

实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2 、顺序表的插入; 3、顺序表的输出; 4 、求顺序表的长度 5 、判断顺序表是否为空; 6 、输出顺序表的第i位置的个元素; 7 、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除; 9 、释放顺序表 三、算法思想与算法描述简图

主函数main

四、实验步骤与算法实现 #in clude #in clude #defi ne MaxSize 50 typedef char ElemType; typedef struct {ElemType data[MaxSize]; in t le ngth; void In itList(SqList*&L)〃 初始化顺序表 L {L=(SqList*)malloc(sizeof(SqList)); L->le ngth=0; for(i=0;ile ngth;i++) prin tf("%c ",L->data[i]); } void DestroyList(SqList*&L)〃 {free(L); } int ListEmpty(SqList*L)〃 {retur n( L->le ngth==O); } int Listle ngth(SqList*L)〃 {return(L->le ngth); } void DispList(SqList*L)〃 {int i; 释放顺序表 L

C++源程序顺序查找与二分查找

一、实验目的 1、掌握顺序查找和二分查找方法的基本思想及其实现技术 2、了解顺序查找和二分查找方法的优缺点和适用范围 二、实验内容(任务、要求或步骤等) 【问题描述】实现在有n个元素的顺序表上的顺序查找和二分查找。 【基本要求】 (1)编写一个创建函数,建立并输出一个有n个元素的顺序表,数据元素为整型。顺序表长度和顺序表的各数据元素由键盘输入。 (2)编写函数实现在有n个元素的顺序表上的顺序查找。 (3)编写函数实现在有n个元素的递增有序的顺序表上的二分查找。 (4)提供菜单,供用户选择要执行的操作,根据用户选择调用相应函数实现顺序查找和二分查找 三:源程序 二分查找如下 #include using namespace std; struct ssTable{ int *elem; int length; } ; void CreatssTable(ssTable &s) { int i; cout<<"请输入表长:"; cin>>s.length; s.elem=new int[s.length+1]; cout<<"\n请输入表中的各个元素"; for(i=1;i<=s.length;i++) cin>>s.elem[i]; } int SeqSearch(ssTable s,int key) { int i;

s.elem[0] = key; // “哨兵” for (i=s.length; s.elem[i]!=key; --i); return i; // 找不到时,i为0 } void main () {ssTable s; int x, pos; CreatssTable(s); cout<<"请输入要查找的值"; cin>>x; pos=SeqSearch(s,x); if(pos>0)cout< using namespace std; struct ssTable{ int *elem; int length; } ; void CreatssTable(ssTable &s) { int i; cout<<"请输入表长:"; cin>>s.length; s.elem=new int[s.length+1]; cout<<"\n请按升序输入表中的各个元素"; for(i=1;i<=s.length;i++) cin>>s.elem[i]; } int BinSearch(ssTable s,int key) { int low,high,mid; low = 1; high = s.length; // 置区间初值 while (low <= high) { mid = (low + high) / 2; if (key==s.elem[mid] ) return mid; // 找到待查元素 else if ( key

顺序查找

《数据结构》实验 题目:顺序查找班级:08计科 学号:10号姓名: #include #define MAX_SIZE 100 typedef struct{ int key; }element; element list[MAX_SIZE]; int seqsearch(element list[],int searchnum,int num); int main() { int i,num,searchnum,k; printf("请输入元素的个数:"); scanf("%d",&num); printf("请输入元素:\n"); for(i=0;i

{ int j; list[num].key=searchnum; for(j=0;list[j].key!=searchnum;j++) ; return j #define MAX_SIZE 100 #define COMPARE(a,b) (a)>(b)?1:(a)==(b)?0:-1 typedef struct{ int key; }element; element list[MAX_SIZE]; int binsearch(element list[],int searchnum,int num); int main() { int i,num,searchnum,k; printf("请输入元素的个数:"); scanf("%d",&num); printf("请输入元素:\n"); for(i=0;i

实验十二 实现顺序和二分查找算法[管理资料]

实验十二实现顺序和二分查找算法[管理资料] 实验十二实现顺序和二分查找算法姓名:张就班级:09计算机一班学 号:2009111111 一、实验目的 掌握顺序和二分查找算法的基本思想及其实现方法。 二、实验内容 对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。三、算法思想与算法描述 1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示: int SeqSearch(SeqList R,int n,KeyType k) { int i=0; while(i=n) return -1; else { printf("%d",R[i].key);

return i; } } 2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录 的位置,失败时返回-1,具体的算法如下: int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid,count=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[ %d ,%d]中找到元素R[%d]:%d\n ",++count,low,high,mid,R[mid].key); if(R[mid].key==k) return mid; if(R[mid].key>k) high=mid-1; else low=mid+1; } return -1; } 四、实验步骤与算法实现 #include #define MAXL 100

顺序表查找

顺序表查找 周次:第4周 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、掌握线性表三种查找的算法。 4、对线性表相应算法的时间复杂度进行分析。 5、理解顺序表数据结构的特点(优缺点)。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。 ⒉软件:Windows操作系统和VC++6; 三、实验要求 1.将实验中所要求的每个功能用一个函数实现。 2.每个输入前要有输入提示,每个输出数据都要求有内容说明(如:280和100的和是:380。)。 3.函数名称和变量名称等用英文或英文简写(每个单词第一个字母大写)形式说明。 四、实验内容 1.在自己的U盘中建立“姓名+学号”文件夹,并在该文件夹中创建“实验1”文件夹(以后每次实验分别创建对应的文件夹),本次实验的所有程序和数据都要求存储到本文件夹中(以后实验都按照本次要求)。 2.阅读参考下面程序,补充完善程序并运行程序,写出结果: (1)补充实现在顺序表中的删除功能函数,并在主函数中补充代码验证算法的正确性。(2)补充实现在顺序表中的查找功能函数,并在主函数中补充代码验证算法的正确性。(注意:查找功能实现顺序查找和二分查找) 3.阅读参考书上程序,实现在顺序表中的删除功能和查找功能函数,并写出结果。 (注意:2和3只要完成其中之一即可,完成后可以截图后发我qq邮箱。) #include "stdafx.h" #include #include #define ERROR 0 #define OK 1 #define INIT_SIZE 5 /*初始分配的顺序表长度*/ #define INCREM 5 /*溢出时,顺序表长度的增量*/

顺序查找

顺序查找 #include #define MAXL 10 typedef int KeyType; typedef struct { KeyType key; }NodeType; typedef NodeType SeqList[MAXL]; int SeqSearch(SeqList R,int n,KeyType k) { int i=0; while(i=n) return -1; else { printf("%d",R[i].key); return i; } } void main(){ SeqList R; int n=10; KeyType k; int a[10],i; printf("输入数字:\n"); for(i=0;i

#include /* INT_MAX等*/ #include /* EOF(=^Z或F6),NULL */ #define OK 1 #define ERROR 0 #define N 5 /* 数据元素个数*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ typedef int KeyType; /* 设关键字域为整型*/ typedef struct /* 数据元素类型(以教科书图9.1高考成绩为例) */ { long number; /* 准考证号*/ char name[9]; /* 姓名(4个汉字加1个串结束标志) */ int politics; /* 政治*/ int Chinese; /* 语文*/ int English; /* 英语*/ int math; /* 数学*/ int physics; /* 物理*/ int chemistry; /* 化学*/ int biology; /* 生物*/ KeyType key; /* 关键字类型应为KeyType,域名应为key,与bo9-1.c中一致*/ } ElemType; ElemType r[N]={{179324,"何芳芳",85,89,98,100,93,80,47}, {179325,"陈红",85,86,88,100,92,90,45}, {179326,"陆华",78,75,90,80,95,88,37}, {179327,"张平",82,80,78,98,84,96,40}, {179328,"赵小怡",76,85,94,57,77,69,44}}; /* 全局变量*/ #define total key /* 定义总分(total)为关键字*/ #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)<=(b)) typedef struct { ElemType *elem; /* 数据元素存储空间基址,建表时按实际长度分配,0号单元留空*/ int length; /* 表长度*/ }SSTable; Status Creat_Seq(SSTable *ST,int n) { /* 操作结果: 构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r) */ int i; (*ST).elem=(ElemType *)calloc(n+1,sizeof(ElemType)); /* 动态生成n个数据元素空间(0号单元不用) */ if(!(*ST).elem) return ERROR; for(i=1;i<=n;i++) *((*ST).elem+i)=r[i-1]; /* 将全局数组r的值依次赋给ST */

二分查找和顺序查找

上机实验报告 实验课题:实现对有序数据集合的顺序查找和二分查找,并展示出查找过程 设计思路: 我们可以采用数组有序的保存所有数据,这样便于将数据的有序性和其索引的有序性统一起来,同时也便于查找数据。需要声明的是,我们不使用零下标的项,这样做是为了在顺序查找中优化传统顺序查找算法,具体原因后面会有详细介绍。为此,我们可以设计一个类,私有变量声明为该数组和数组的长度。由于集合中的数据类型未知,所以该类为模板类。 对于公有成员,我们创建六个成员函数,除了构造函数和析构函数,其他四个函数分别用来获取外界传入的数组长度、获取外界传入的数组数据、对数据实现顺序查找、对数据实现二分查找。 这里,我们只重点介绍顺序查找函数和二分查找函数。 对于顺序查找,我们对传统的顺序查找方法进行优化,避开每次对数据索引是否越界进行判断这一步骤。具体做法是:将所查找的元素保存在零下标的项中(这也是零下标闲置的原因),然后按照下标顺序从后向前依次遍历匹配所查找元

素与数组元素。若两者相等,展示出该数组元素,并将其下标值反馈给客户;若两者不相等,展示出该元素,进行下一轮匹配。若最终标记下标达到零下标处,说明未查找到所要查找的元素,则客户反馈该信息。 优化后的顺序查找算法比传统的顺序查找算法减少一半的步骤,原因在于每次无须判断标记下标是否越界,这是该算法优化后的优点。它的缺点是没有利用到数据集合有序这一性质,且查找效率低。 对于二分查找,我们声明三个整型变量low、high和mid 依次标记查找域的上界下标、下界下标和中值下标,其中mid=(low+high)/2。我们在开始的时候将low初始化为1(上文中提到过,我们是从下表为1的位置开始存储数据),将high初始化为len(数组长度),并由此初始化mid的值。对于任意一次查找,将索引为mid的值与所查找的值进行比较。若两者相等,则将该元素的索引值反馈给客户;若所查找的值比索引为mid的值小,则将high的值变为mid-1,进行下一轮的查找;若所查找的值比索引为mid的值大,则将low 的值变为mid+1,进行下一轮查找。若最终low>high,则表明未查找到所要查找的值,将此信息反馈给客户。 该算法是一种效率很高的算法,因为它充分利用到数据集合的有序性,这一优点在数据规模较大时体现的更明显。

十二顺序查找和二分查找

实验十二实现顺序和二分查找算法 班级计算机三班学号 2009131334 姓名尹亮 一、实验目的 掌握顺序和二分查找算法的基本思想及其实现方法。 二、实验内容 对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。 三、实验要点及说明 查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)的操作,应用十分广泛。 顺序查找是一种最简单的查找方法。它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。 二分查找也称为折半查找要求线性表中的结点必须己按关键字值的递增或递减顺序排列。它首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。 #include

#define maxl 100 typedef int keytype; typedef char infotype [10]; typedef struct { keytype key; infotype data; }nodetype; typedef nodetype seqlist[maxl]; int binsearch(seqlist r,int n,keytype k) { int low=0,high=n-1,mid,count=0; while (low<=high) { mid=(low+high)/2; printf("第%d次查找:在[%d,%d]中查找到元素r[%d]:%d\n",++count,low,high,mid,r[mid].key); if(r[mid].key==k) return mid; if(r[mid].key>k) high=mid-1;

scratch课程-52第五十二课二分查找法

今日任务: 今日我们来利用scratch进行一次二分查找算法的探究。所谓二分查找法,就是这样一 种查找思路,但是,它的使用有一定的局限性,被查找的数列必须是有序数列。它的原理其 Left=1 Right=5 1,3,5,7,11,33,37,42,56,79,88,102,113,117,128,142,155,161,177,208 Mid=3 11≠list(3)且11>list(3),继续在前后半部分查 找!

Left=4 Right=5 1,3,5,7,11,33,37,42,56,79,88,102,113,117,128,142,155,161,177,208 Mid=5 11=list(5),查找结束!返回列表位置5. 如果是按照顺序查找法,需要查找5次,而用二分法只需要4次就可以查找到了,如果有序数列更复杂一些更长一些,二分法比顺序查找法的优势就更加明显!

跟我来挑战Follow me: 第一步:启动scratch软件; 第二步:点击上方的“文件”→“保存”→保存到桌面,文件名:二分查找→点击“保存”;(第二步很很很重要,我希望所有的学生都能养成及时保存作品的好习惯!) 第三步:首先我们先生成一个斐波那契数列 程序较长,我们单独将二分法算法程序 定义为一个单独地功能块(子程序), 用的时候调用就可以了!

还记得left 和right 、mid 分别是什么?再提醒一下! n=list(mid)

最后直接调用这个功能块即可: 该程序的运行结果是: 课后思考: (1) 试着总结一下二分法的优缺点? 优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表, 且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 (2)想一想,二分查找法的用途有哪些?二分查找法是最省优查找算法吗?有没有更高 效的算法处理有序数列? (3) 自己尝试设计出一个随即有序数列,尝试用二分法去查找结果。

算法与数据结构的顺序查找

#include"stdio.h" #include"stdlib.h" #include"string.h" #define MAX 31 typedef struct {int*k; int*elem; char*aa; int length; }SSTable; int lw_Search(SSTable ST,int key) { int i; ST.elem[0]=key; for(i=ST.length;ST.elem[i]!=ST.elem[0];--i); return i; } int lw_Search2(SSTable ST,int n,int key) { int low=1;int high=ST.length;int mid,a=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[%d,%d]中找到元素 ST[%d]: %d\n",++a,low,high,mid,ST.k[mid]); if(ST.k[mid]==key) return mid; else if(ST.k[mid]>key) high=mid-1; else low=mid+1; } return 0; } int lw_bubble(SSTable ST,int n) {int i,j,temp;int*a; for(i=1;iST.k[j]) {

temp=ST.k[i]; ST.k[i]=ST.k[j]; ST.k[j]=temp; } } int lw_prit(SSTable ST,int n) { int i;int*a; for(i=1;ikey) high=mid-1; else low=mid+1; } return 0; } char lw_bubble2(SSTable ST,int n) {int i,j;char temp; for(i=1;i

相关主题
文本预览
相关文档 最新文档