《数据结构》实验报告三:几种查找算法的实现和比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]);

相关文档
最新文档