实验八 查找算法的实现

您所在的位置:网站首页 infotype数据结构 实验八 查找算法的实现

实验八 查找算法的实现

2024-06-30 15:51| 来源: 网络整理| 查看: 265

实验目的

熟练掌握顺序表和有序表的查找方法,掌握其时间复杂度的分析方法

实验内容

(1)验证并设计顺序表的查找(顺序查找、折半查找)算法

(2)验证二叉排序树上的查找(创建、查找、插入)算法

(3)验证Hash表查找(Hash函数定义、建立,查找,插入)算法

问题描述

    (说明你选做的题目及要求)

验证并设计顺序表的查找,通过顺序查找和折半查找算法。验证二叉排序树上的查找,并实现二叉树的创建查找插入等基本操作。验证Hash表查找,实现Hash函数定义,建立,查找,插入等基本操作算法。

数据结构定义

    (说明你算法中用到的数据结构、数据类型的定义)

以顺序表或线性表表示静态查找表。

Typedef struct{ ElemType  *elem; Int        length; }SSTable; 算法思想及算法设计

    (先文字说明算法的思想,然后给出类C语言算法)

设有n个数据元素的顺序表,从表的一端(前端或后端)开始,用给定的值依次和表中各数据元素的关键字进行比较,若在表中找到某个数据元素的关键字和给定值相等,则查找成功,给出该数据元素在表中的位置;若查遍整个表,不存在关键字等于给定值的数据元素,则查找失败,给出失败信息。

#define N 11 //顺序查找(适用于线性表) int Seq_Search(int *arr, int key) { int i; arr[0] = key;//0号下标作为哨兵 for (i = N-1; arr[i] != key; i--); return i;}

折半查找:如果查找区间长度小于1(low>high)则表示查找失败,返回-1;否则继续以下步骤。2)求出查找区间中间位置的数据元素下标mid(mid=(low+high)/2)。3)用区间中间位置的数据元素的关键字elem[mid]与给定值key进行比较,比较的结果有以下三种可能。

①若elem[mid]=key,则查找成功,报告成功信息并返回其下标mid。

②若elem[mid]key,则说明如果数据表中存在要找的数据元素,该数据元素一定在mid的左侧。可把查找区间缩小到数据表的前半部分**(high=mid-1)**,再维续进行折半查找(转步骤1)。

//折半查找(二分查找),适用于有序的顺序表

int Binary_Search(int *arr, int key) { int low = 1;//元素起始下标 int high = N-1;//最后元素下标 int mid;//中间元素下标 while (low key) high = mid - 1;//查找前半部分 else low = mid + 1;//查找后半部分 } return -1;//查找失败 }

(2)二叉排序树的查找与折半查找类似,根结点相当于查找区间的中点,左子树相当于前半子区间,右子树相当于后半子区间。查找过程为:若根结点的关键字值等于查找的关键字,成功。否则,若小于根结点的关键字值,查找左子树。若大于根结点的关键字值,查找右子树。若子树为空,查找不成功。

int SearchBTS(BTNode *T,int key,BTNode *f,BTNode *&p){//二叉排序树的查找     BTNode *r,*s;     if(!T){         p=f;//p指向他父亲         return 0;     }else{         if(key==T->data){             p=T;             return 1;         }else if(keydata){             return SearchBTS(T->lchild,key,T,p);         }else{             return SearchBTS(T->rchild,key,T,p);   }}}

二叉排序树的插入操作主要包括以下几个过程:

1.首先判断插入结点,和树中结点是否存在重复,这时候用到的是结点的搜索操作,若没有重复的节点,就进行后面的插入操作。

2.创建一个新结点,存储插入结点的值。

3.如果是空树,插入结点直接插入进去。

4.如果树不为空,插入结点的值小于最后一个结点的值,插入结点连接最后一个结点的左子树;插入结点的值大于最后一个结点的值,插入结点连接最后一个结点的右子树。

int InsertBST(BTNode *&T,int key){//二叉树的插入     BTNode *p,*s;     if(!SearchBTS(T,key,NULL,p)){         s=(BTNode *)malloc(sizeof(BTNode));         s->data=key;         s->lchild=s->rchild=NULL;         if(!p){             T=s;         }else if(keydata){             p->lchild=s;         }else{             p->rchild=s;         }         return 1;     }     return 0; }

实验代码

    (即C语言程序)

(1)

int main() { //数组的0号下标不存放实际意义key(可以声明时存放数组长度) int arr1[N] = { N,1,4,2,7,5,6,9,8,3,0 }; if (Seq_Search(arr1, 4) != 0) printf("4元素下标为:%d\n", Seq_Search(arr1, 4)); else printf("该元素不存在!\n"); int arr2[N] = { N,0,1,2,3,4,5,6,7,8,9 }; if (Binary_Search(arr2, 4) != -1) printf("4元素下标为:%d\n", Binary_Search(arr2, 4)); else printf("该元素不存在!\n"); return 0; }

(2)

#include #include typedef struct BTNode{     int data;     BTNode *lchild;     BTNode *rchild; }BTNode; int SearchBTS(BTNode *T,int key,BTNode *f,BTNode *&p){//二叉排序树的查找     BTNode *r,*s;     if(!T){         p=f;//p指向他爹         return 0;     }else{         if(key==T->data){             p=T;             return 1;         }else if(keydata){             return SearchBTS(T->lchild,key,T,p);         }else{             return SearchBTS(T->rchild,key,T,p);         }     } } int InsertBST(BTNode *&T,int key){//二叉树的插入     BTNode *p,*s;     if(!SearchBTS(T,key,NULL,p)){         s=(BTNode *)malloc(sizeof(BTNode));         s->data=key;         s->lchild=s->rchild=NULL;         if(!p){             T=s;         }else if(keydata){             p->lchild=s;         }else{             p->rchild=s;         }         return 1;     }     return 0; } void createBTS(BTNode *&T,int arr[],int n){     for(int i=0;ilchild);         printf("%d ",T->data);         LDR(T->rchild);     } } int main(int argc, char** argv) {     BTNode *T;     int arr[]={5,9,35,8,7,21,6,4};     for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3