《数据结构》实验报告三:几种查找算法的实现和比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三次实验报告:几种查找算法的实现和比较
//2019-12-4
//1.随机生成5万个整数,存入一个文件;
//2.算法实现:(1)顺序查找:读入文件中的数据,查找一个key,统计时间;
// (2)二分查找:读入文件,排序,二分查找key,统计时间;
// (3)分块查找:读入文件,分100块,每块300+数字,查找key,统计时间
// (4)二分查找树:读入文件,形成BST,查找key,统计时间
//二叉排序树:建立,查找
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
struct JD
{//定义分块查找的链表结点结构
int data;
JD *next;
};
struct INDEX_T
{//定义分块查找中,索引表结构
int max;//这一块中最大的数字, JD *block;//每一块都是一个单向链表,这是指向块的头指针}; INDEX_T myBlock[100];//这是索引表的100项 struct NODE {//定义的二分查找树结点结构 int data; NODE *left; NODE *right; }; const int COUNT=50000;//结点个数 int key=666;//待查找的关键字 int m=1;// int *array2; void createData(char strFileName[]) {//产生随机整数,存入文件 srand((unsigned int)time(0)); FILE *fp=fopen(strFileName,"w"); for(int i=1;i<=COUNT;i++) fprintf(fp,"%d,",rand()); fclose(fp); } void createBST(NODE* &bst) {//产生5万个随机整数,创建二叉排序树 FILE *fp=fopen("data.txt","r"); for(int i=1;i<=COUNT;i++) { int num; fscanf(fp,"%d,",&num);//从文件中读取一个随机整数 //若bst是空子树,第一个结点就是根结点 //若bst不是空子树,从根结点开始左小右大,查找这个数字,找到了直接返回, //找不到,就插入到正确位置 //创建一个结点 NODE* p=new NODE; p->data=num; p->left=0; p->right=0; if(0==bst)//空子树 { bst=p; continue; } //非空子树,//在bst中,查找给结点, NODE *q=bst;//总是从根结点开始查找 while(1) { if(p->data == q->data)//找到了,直接退出break; if(p->data < q->data && q->left==0) {//小,往左找,且左边为空,直接挂在q之左q->left=p; break; } if(p->data < q->data && q->left!=0) {//小,往左找,且左边非空,继续往左边找q=q->left; continue; } if(p->data > q->data && q->right==0) {//大,往右找,且右边为空,直接挂在q之右q->right=p; break; } if(p->data > q->data && q->right!=0) {//大,往右找,且右边非空,继续往右边找q=q->right; continue; } } } } int BST_Search(NODE *bst,int key) {//在bst中找key, if(0==bst) return -1; //非空子树,//在bst中,查找给结点, NODE *q=bst;//总是从根结点开始查找 while(1) { if(key == q->data)//找到了,直接退出 return 1; if(key < q->data && q->left==0)//小,往左找,且左边为空,找不到 return -1; if(key < q->data && q->left!=0)//小,往左找,且左边非空,继续往左边找 { q=q->left; continue; } if(key > q->data && q->right==0)//大,往右找,且右边为空,找不到 return -1; if(key > q->data && q->right!=0) {//大,往右找,且右边非空,继续往右边找 q=q->right; continue; } } } void inOrder(NODE *bst) { if(bst!=0) { inOrder(bst->left); array2[m]=bst->data;//反写回array数组,使数组有序 // printf("%7d",array2[m]);