当前位置:文档之家› 二叉排序树的查找算法的设计和性能分析实验报告

二叉排序树的查找算法的设计和性能分析实验报告

二叉排序树的查找算法的设计和性能分析实验报告
二叉排序树的查找算法的设计和性能分析实验报告

“数据结构”课程设计报告二叉排序树的查找算法的设计和性能分析

学生姓名:王玉杨甜利

指导教师:陈少军

所在系:电子信息系

所学专业:计算机科学与技术

年级:2010级计算机(1)班

目录

第一章需求分析 0

1.1 选题要求 (2)

1.2选题的背景与意义 (2)

1.3 课程设计目标 (2)

1.4 人员组成和分工 (4)

第二章概要分析 (5)

2、1设计流程图 (5)

2、2部分数据(截图) (3)

2、3模块划分...................................................................... 错误!未定义书签。

第三章详细设计 (6)

3.1概要设计 (6)

3.2函数调用图 (5)

3.3主要函数 (7)

第四章用户手册 (8)

4.1 运行程序 (8)

4.2 程序出现问题 (8)

第五章系统测试 (9)

第五章项目总结 (9)

参考文献 (90)

附录...................................................................................... 数据结构课程设计评分表

1.1 选题要求

?(1) 根据提供的文件读取数据以姓名做关键字创建二叉排序树

?(2) 输入关键字在建立好的二叉树中查找,并输出相关信息。

?(3) 输出比较查找次数,平均查找长度做性能分析。

1.2选题的背景与意义

(1)选题背景

文件系统和数据库系统一般都采用树的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了。二叉排序树是一种比较有用的折衷方案。数组的搜索比较方便,可以直接用下标。链表与之相反,删除和插入元素很快,但查找很慢。二叉排序树就既有链表的好处,也有数组的好处。在处理大批量的动态的数据是比较有用。

(2) 选题的意义:

A、熟练掌握二叉排序树的创建。

B、掌握二叉排序树的查找

C、掌握二叉排序树查找时的查找次数。

D、加深对二叉排序树结构和性质的理解,逐步培养解决实际问题的编程能力

1.3 课程设计目标

(1) 掌握一些基本算法框架的架构。

(2) 对比了解二叉排序树的优劣。

(3) 巩固课程知识的学习。

1.4 人员组成和分工

小组成员主要分工细则备注

王玉二叉排序树的建立细节方面相互

探讨不断纠错

察错不断改进

杨甜利关键字查找

2.1设计流程图

流程概述:以姓名做关键建立二叉排序树,并从键盘输入在二叉排序树中进行查找及性能分析。

2.2 部分数据(截图)

读文件

输入一个学生的姓名

输出查找结构及比较

次数

创建二叉排序树

查找

2.3模块划分

文件操作 建立二叉排序树

查找函数

Main 函数

插入函数

第三章详细设计

3.1概要设计

①读文件函数:fp=fopen("c:\\a.txt","r");

②插入并建立二叉排序树:Insert(BiTreeNode *root, DataType item)

③查找关键字:Search(BiTreeNode **root, DataType item)

④查找性能分析:SearchCount;

3.2函数调用图如下:

3.3主要函数

int main()

{

DataType A;

FILE *fp;

数查找关键字

读入文件数据构造二叉排序树

fp=fopen("c:\\a.txt","r");

while(fscanf(fp,"%s %d %s",A.ID,&A.number,A.key )!=EOF){

int Insert(BiTreeNode *root, DataType item);

}

fclose(fp);

return OK;

BiTreeNode *root = NULL;

while(1){

int p;

char ID;

printf("\n输入要查找的姓名(输入0查找结束):");

scanf("%s",&ID);

if(ID==0) break;

InTraverse(root);

if(p==0) printf("没有找到!");

else

printf("\n查找结果:报名号=%s 编号=%d 姓名=%s",A.ID,A.number ,A.key );

}

}

第四章用户手册

4.1 运行程序

读取文件创建二叉排序树,按照提示输入关键字,查找关键字。

4.2 程序运行出现的问题及解决办法

程序运行过程中会出现各种各样的问题,其中最主要的问题有

1.查找过程中出现了关键字输入时,却未像预期那样输出关键字信息,而总是输出最后个人的信息。

解决方法:在老师的纠正下发现函数的返回值的参数类型传递错。

2.查找次数的与总计数混合

解决方法:由于能力有限所以未能更好的对此点进行改正,所以选择了返回总计数并进行了性能分析。(希望以后可以有机会做的更好)

第五章项目总结

本程序由我很一名成员对各个模块进行编写,之后由我们共同对各个模块进行进行组合调试,期间经过了老师的指导,让我们发现了我们许多的不足之处:( 1 ) 许多概念性的知识还不够扎实,需要我们继续巩固。

( 2 ) 各模块进行组合时,出现了许多错误,原因是组员之间没有对函数的定义名进行好的沟通,定义名出现了几种不同的写法。

(3)在经过不懈的努力下虽然上程序基本上可以运行,但是在程序的健壮性和方便性始终觉得性能差了些,也由于一些个人原因使得程序显得没有预期那样的完整,及功能的丰富性。希望以后可以多学习,多操作!!

参考文献:

[1] 田鲁怀编著的《数据结构》,北京:电子工业出版社出版,2006.8

[2]《数据结构(C语言版)》严蔚敏吴伟民北京:清华大学出版社

[3] 《数据结构与算法分析》(C语言版)维斯张怀勇编著

[4] 百度文库

数据结构课程设计评分表

题目二叉排序树的查找算法的设计和性能分析专业班级计算机2010(1)班提交日期

小组成员学号姓名分工和工作量成绩组长1082086 王玉二叉排序树的建立

组员1082102 杨甜利关键字查找

小组评分表

评分项目分数

1、实现情况(15分)完成课程设计要求的情况。

2、系统分析(10分)对系统的理解及分析的深入程度。

3、系统设计(20分)总体设计、具体设计、数据结构设计等。

4、程序设计(30分)程序设计方法和编程工具掌握。

5、界面设计(15分)界面友好、操作方便等。

6、论文撰写(10分)论文撰写规范、合理等。

小组总成绩

指导教师评语

教师签名日期

个人成绩和小组评分及指导教师评语由指导教师填写

数据结构课程设计AVL树实现及其分析实验报告

算法与数据结构 课程设计报告 题目: A VLree的实现及分析 班级: 12计算机1 学号: 1200303132 姓名: 熊成毅 成绩: 2013年12月31日

一、AVLree的实现及分析 AVL 树是平衡的二元查找树。一株平衡的二元查找树就是指对其每一个节点,其左子树和右子树的高度只差不超过1. 编写程序实现AVL树的判别;并实现AVL树的ADT,包括其上的基本操作;节点的加入和删除。BSt和AVL的差别就在平衡性上,所以AVL的操作关键要考虑如何在保持二元查找树定义条件下对二元树进行平衡化。 (1)编写AVL树的判别程序,并判别一个人元查找数是否为AVL树。二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8. (2)实现AVL树的ADT,包括其上的基本操作:节点的加入和删除,另外包括将一般二元查找树转变为AVL树的操作。 二、设计思想(宋体,三号加粗) 任意给定一组数据,设计一个算法,建立一棵平衡二叉树,对它进行查找、插入、删除等操作。平衡二叉树ADT结构如下: typedef struct{ Status key; }ElemType; typedef struct BSTNode{ ElemType data; Status bf; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; 给出一组数据,通过 InsertAVL(BSTree &T, ElemType e, Status &taller)插入算法,构建平衡二叉树,若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。 在此算法中,利用到递归算法和 LeftBalance(BSTree &T)左平衡处理,RightBalance(BSTree &T)右平衡处理。进而实现构建平衡二叉树,使其左子树和右子树的高度之差不超过1. LeftBalance(BSTree &T)对以指针T所指结点为根的二叉树作左平衡旋转处理。本算法结束时,指针T指向新的根结点。 RightBalance(BSTree &T)// 对以指针T所指结点为根的二叉树作右平衡旋转处理。本算法结束时,指针T指向新的根结点。 R_Rotate(BSTree &p)对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点 L_Rotate(BSTree &p)对以p↑为根的二叉排序树作左旋处理,处理之后p指向新的树

插入排序算法实验报告

算法设计与分析基础 实验报告 应用数学学院 二零一六年六月

实验一插入排序算法 一、实验性质设计 二、实验学时14学时 三、实验目的 1、掌握插入排序的方法和原理。 2、掌握java语言实现该算法的一般流程。 四、实验内容 1、数组的输入。 2、输入、输出的异常处理。 3、插入排序的算法流程。 4、运行结果的输出。 五、实验报告 Ⅰ、算法原理 从左到右扫描有序的子数组,直到遇到一个大于(或小于)等于A[n-1]的元素,然后就把A[n-1]插在该元素的前面(或后面)。 插入排序基于递归思想。 Ⅱ、书中源代码 算法InsertionSort(A[0..n-1]) //用插入排序对给定数组A[0..n-1]排序 //输入:n个可排序元素构成的一个数组A[0..n-1] //输出:非降序排列的数组A[0..n-1] for i ←1 to n-1 do v ← A[i] j ← i-1 while j ≥0and A[j] > v do A[j+1] ← A[j] j ← j-1 A[j+1] ← v

Ⅲ、Java算法代码: import java.util.*; public class Charu { public static void main(String[] args) { int n = 5; int a[] = new int[n]; int s = a.length; int i = 0, j = 0, v = 0; System.out.println("请输入若干个数字:"); Scanner sc = new Scanner(System.in); try { while (i < s) { a[i] = sc.nextInt(); i++; } for (i = 1; i = 0 && a[j] > v) { a[j + 1] = a[j]; j--; } a[j + 1] = v; } System.out.println("插入排序结果显示:"); for (i = 0; i < s; i++) { System.out.println(a[i]); } } catch (Exception es) { System.out.println(es); } } } Ⅳ、运行结果显示:

二分搜索实验报告

竭诚为您提供优质文档/双击可除 二分搜索实验报告 篇一:算法设计与分析二分查找实验报告 课程设计说明书 设计题目:二分查找程序的实现 专业:班级: 设计人: 山东科技大学年月日 课程设计任务书 学院:信息科学与工程学院专业:班级:姓名: 一、课程设计题目:二分查找程序的实现二、课程设计主要参考资料 (1)计算机算法设计与分析(第三版)王晓东著(2)三、课程设计应解决的主要问题 (1)二分查找程序的实现(2)(3)四、课程设计相关附件(如:图纸、软件等): (1)(2) 五、任务发出日期:20XX-11-21课程设计完成日期:

20XX-11-24 指导教师签字:系主任签字: 指导教师对课程设计的评语 成绩: 指导教师签字: 年月日 二分查找程序的实现 一、设计目的 算法设计与分析是计算机科学与技术专业的软件方向的必修课。同时,算法设计与分析既有较强的理论性,也有较强的实践性。算法设计与分析的实验过程需要完成课程学习过程各种算法的设计和实现,以达到提高教学效果,增强学生实践动手能力的目标。 用分治法,设计解决二分查找程序的实现问题的一个简捷的算法。通过解决二分查找程序的实现问题,初步学习分治策略。 二、设计要求 给定已按升序排好序的n个元素a[0:n-1],现要在这n 个元素中找出一特定元素x。实现二分搜索的递归程序并进行跟踪分析其执行过程。 用顺序搜索方法时,逐个比较a[0:n-1]中的元素,直至找出元素x,或搜索遍整个数组后确定x不在其中。这个方

法没有很好的利用n个元素已排好序这个条件,因此在最坏情况下,顺序搜索方法需要o(n)次比较。要求二分法的时间复杂度小于o(n)。 三、设计说明(一)、需求分析 二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用o(logn)时间完成搜索任务。 该算法的流程图如下: (二)、概要设计 二分查(:二分搜索实验报告)找的基本思路是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果 x=a[n/2],则找到x,算法终止;如果xa[n/2],则只要在数组a的右半部分继续搜索x。 由于二分查找的数组不一定是一个整数数组,所以我采用了c++中的模板函数,将排序函数sort和二分查找函数binarysort写为了模板函数,这样不尽可以查找整数数组,也可以查找小数数组。 由于查找的数组的长度不固定,所以我用了c语言中的malloc和realloc函数,首先定义一个数组指针,用malloc 函数该它分配空间,然后向数组中存数,当数组空间满时,在用realloc函数为数组再次分配空间。由于在随机输入一组数时不知在什么位置停止,所以 篇二:二分搜索实验报告

排序算法比较实验报告

信息学部算法分析 上机报告 学号0901******** 姓名陈龙 指导老师秦明 时间2011.11.1~11.23

一.上机实验题目 实验1 比较归并排序和快速排序的区别。 实验2 利用贪心算法对背包问题进行求解。 二.算法设计思路 归并排序: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列,设定两个指针,最初位置分别为两个已经排序序列的起始位置,比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置,重复步骤直到某一指针达到序列尾,将另一序列剩下的所 有元素直接复制到合并序列尾。 快速排序: 设置两个变量I、J,排序开始的时候:I=0,J=N-1;以第一个数组元素作为关键数据,赋值给key,即key=A[0];从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与key交换;从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与key交换;重复第3、4、5步,直到I=J;(3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i,j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。) 背包问题: 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 。可以压缩空间,f[v]=max{f[v],f[v-c[i]]+w[i]}

三. 源程序 归并排序 #include #include # define N 50 int b[N],a[N]; int n,i; void Merge (int low, int mid,int high) //合并 { int i; int l=low,h=mid+1,k=l; while ((l<=mid) && (h<=high)) //部分合并 { if (a[l]<=a[h]) b[k++]=a[l++]; else b[k++]=a[h++]; } if(l>mid) while (h<=high) b[k++]=a[h++]; //转储剩余部分 else while(l<=mid) b[k++]=a[l++]; for (i=0;i<=high;i++) //将b数组转储到a a[i]=b[i]; } int Merge2 (int l,int h) //分类 { for (i=0;i

数据结构二叉排序树实验报告

实验报告 课程名:数据结构(C语言版)实验名:二叉排序树 : 班级: 学号: 撰写时间:2014.12.18

一实验目的与要求 1.掌握二叉排序树上进行插入和删除的操作 2.利用C 语言实现该操作 二实验内容 ?对于一个线形表, 利用不断插入的方法, 建立起一株二叉排序树 ?从该二叉排序树中删除一个叶子节点, 一个只有一个子树的非叶子节,一个有两个子树的非叶子节点。 三实验结果与分析 #include #include //二叉查找树结点描述 typedef int KeyType; typedef struct Node { KeyType key; //关键字 struct Node * left; //左孩子指针 struct Node * right; //右孩子指针 struct Node * parent; //指向父节点指针 }Node,*PNode;

//往二叉查找树中插入结点 //插入的话,可能要改变根结点的地址,所以传的是二级指针void inseart(PNode * root,KeyType key) { //初始化插入结点 PNode p=(PNode)malloc(sizeof(Node)); p->key=key; p->left=p->right=p->parent=NULL; //空树时,直接作为根结点 if((*root)==NULL){ *root=p; return; } //插入到当前结点(*root)的左孩子 if((*root)->left == NULL && (*root)->key > key){ p->parent=(*root); (*root)->left=p; return; } //插入到当前结点(*root)的右孩子 if((*root)->right == NULL && (*root)->key < key){ p->parent=(*root);

《数据结构》实验报告——排序.docx

《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 1. 插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i 趟直接插入排序的操作为:在含有i-1 个记录的有序子序列r[1..i-1 ]中插入一个记录r[i ]后,变成含有i 个记录的有序子序列r[1..i ];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r [0]处设置哨兵。在自i-1 起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2. 快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s] ,L.r[s+1],…L.r[t]}, 首先任意选取一个记录 (通常可选第一个记录L.r[s])作为枢轴(或支点)(PiVOt ),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i 作为界线,将序列{L.r[s] ,… ,L.r[t]} 分割成两个子序列{L.r[i+1],L.[i+2], …,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针lOw 和high ,他们的初值分别为lOw 和high ,设枢轴记录的关键字为PiVOtkey ,则首先从high 所指位置起向前搜索找到第一个关键字小于PiVOtkey 的记录和枢轴记录互相交换,然后从lOw 所指位置起向后搜索,找到第一个关键字大于PiVOtkey 的记录和枢轴记录互相 交换,重复这两不直至low=high 为止。 具体实现上述算法是,每交换一对记录需进行3 次记录移动(赋值)的操作。而实际上,

(完整word版)查找、排序的应用 实验报告

实验七查找、排序的应用 一、实验目的 1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。 2、学会比较各种排序与查找算法的优劣。 3、学会针对所给问题选用最适合的算法。 4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。 二、实验内容 [问题描述] 对学生的基本信息进行管理。 [基本要求] 设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:1.总成绩要求自动计算; 2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现); 3.排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。 [测试数据] 由学生依据软件工程的测试技术自己确定。 三、实验前的准备工作 1、掌握哈希表的定义,哈希函数的构造方法。 2、掌握一些常用的查找方法。 1、掌握几种常用的排序方法。 2、掌握直接排序方法。

四、实验报告要求 1、实验报告要按照实验报告格式规范书写。 2、实验上要写出多批测试数据的运行结果。 3、结合运行结果,对程序进行分析。 五、算法设计 a、折半查找 设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。初始时,令low=1,high=n,mid=(low+high)/2,让key与mid指向的记录比较, 若key==r[mid].key,查找成功 若keyr[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败 b、顺序查找 从表的一端开始逐个进行记录的关键字和给定值的比较。在这里从表尾开始并把下标为0的作为哨兵。 void chaxun(SqList &ST) //查询信息 { cout<<"\n************************"<=1;j--) if(ST.r[j].xuehao

算法排序问题实验报告

《排序问题求解》实验报告 一、算法的基本思想 1、直接插入排序算法思想 直接插入排序的基本思想是将一个记录插入到已排好序的序列中,从而得到一个新的,记录数增1 的有序序列。 直接插入排序算法的伪代码称为InsertionSort,它的参数是一个数组A[1..n],包含了n 个待排序的数。用伪代码表示直接插入排序算法如下: InsertionSort (A) for i←2 to n do key←A[i] //key 表示待插入数 //Insert A[i] into the sorted sequence A[1..i-1] j←i-1 while j>0 and A[j]>key do A[j+1]←A[j] j←j-1 A[j+1]←key 2、快速排序算法思想 快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序序列为数组A[1..n],首先选取第一个数A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比A[0]大的数都排在它的位置之前,将所有比A[0] 小的数都排在它的位置之后,由此以A[0]最后所在的位置i 作为分界线,将数组A[1..n]分成两个子数组A[1..i-1]和A[i+1..n]。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A[1..i-1]和A[i+1..n]排序。 一趟快速排序算法的伪代码称为Partition,它的参数是一个数组A[1..n]和两个指针low、high,设枢轴为pivotkey,则首先从high 所指位置起向前搜索,找到第一个小于pivotkey 的数,并将其移到低端,然后从low 所指位置起向后搜索,找到第一个大于pivotkey 的数,并将其移到高端,重复这两步直至low=high。最后,将枢轴移到正确的位置上。用伪代码表示一趟快速排序算法如下: Partition ( A, low, high) A[0]←A[low] //用数组的第一个记录做枢轴记录 privotkey←A[low] //枢轴记录关键字 while low=privotkey do high←high-1 A[low]←A[high] //将比枢轴记录小的记录移到低端 while low

各种排序实验报告

【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。 为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。 【二】概要设计 1.堆排序 ⑴算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。将序列所存储的元素A[N]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N)。 ⑵程序实现及核心代码的注释: for(j=2*i+1; j<=m; j=j*2+1) { if(j=su[j]) break; su[i]=su[j]; i=j; } su[i]=temp; } void dpx() //堆排序 { int i,temp; cout<<"排序之前的数组为:"<=0; i--) { head(i,N); } for(i=N-1; i>0; i--) {

temp=su[i]; su[i]=su[0]; su[0]=temp; head(0,i-1); } cout<<"排序之后的数组为:"<

二分搜索实验报告

二分搜索 一.实验目的: 1.理解算法设计的基本步骤及各步的主要内容、基本要求; 2.加深对分治设计方法基本思想的理解,并利用其解决现实生活中的问题; 3.通过本次实验初步掌握将算法转化为计算机上机程序的方法。 二.实验内容: 1.编写实现算法:给定n个元素,在这n个元素中找到值为key的元素。 2.将输入的数据存储到指定的文本文件中,而输出数据存放到另一个文本文件中,包括结果和具体的运行时间。 3.对实验结果进行分析。 三.实验操作: 1.二分搜索的思想: 首先,假设表中的元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复上述过程,知道找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 由于二分搜索是基于有序序列的一种搜索算法,故将输入的一组数据首先进行排序,考虑到输入数据可能有多个,采用快速排或者是合并排序,其中与冒泡做了对比。 冒泡排序算法: void sort(int List[],int length){ int change; for(int i=0;iList[j]){ change=List[i]; List[i]=List[j]; List[j]=change; } } } 快速排序算法: void Qsort(int List[],int low,int high){ if(low>=high) return; int first=low; int last=high; int key=List[first]; while(first=key) --last; List[first]=List[last]; while(first

北邮数据结构实验—二叉排序树

数据结构 实 验 报 告 实验名称:______二叉排序树___________ 学生姓名:____________________ 班级:_______________ 班内序号:_______________________ 学号:________________ 日期:________________

1.实验要求 根据二叉排序树的抽象数据类型的定义,使用二叉链表实现一个二叉排序树。 二叉排序树的基本功能: 1.二叉排序树的建立 2.二叉排序树的查找 3.二叉排序树的插入 4.二叉排序树的删除 5.二叉排序树的销毁 6.其他:自定义操作编写 测试main()函数测试二叉排序树的正确性 2. 程序分析 2.1 存储结构 二叉链表 2.2 程序流程(或程序结构、或类关系图等表明程序构成的内容,一般为流程图等) 2.2.1.

2.2.2.伪代码 1.从文件读取待建树元素 2.建树,若待插入元素比根节点小,向左子树前进并重复比较左子树根节点,若待插入元素比根节点大,向右子树前进并重复比较右子树根节点,直至找到空节点则插入该元素,不断插入直至不剩下元素。 3.用户选择操作。 4.若用户选择查找,则现由用户输入待查找数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至关键码相等,则输出节点情况。 5.若用户选择插入,则现由用户输入待插入数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至到空节点,则插入该元素。 6.若用户选择删除,则现由用户输入待删除数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至关键码相等; 1).若该节点为叶子节点,则直接删除; 2).若该节点无左子树,则其双亲节点直接与其右子树根节点连接,再删除该节点; 3).若该节点有左子树,则其左子树的最右节点数值直接覆盖该节点数值,再删除最后节点。 7.若用户选择销毁,则不断执行删除操作直至不剩余节点。 8.若用户选择退出,则程序结束。 2.3 关键算法分析 关键代码即删除操作,代码如下: void Delete(BiNode* &R) { BiNode* q=new BiNode; BiNode *s=new BiNode; if(R->lch==NULL){ q=R; R=R->rch; delete q;} else if(R->rch==NULL){ q=R; R=R->lch; delete q; } else{ q=R; s=R->lch; while(s->rch!=NULL) { q=s; s=s->rch;} R->data=s->data; if(q!=R)

算法排序问题实验报告

《排序问题求解》实验报告 一、算法得基本思想 1、直接插入排序算法思想 直接插入排序得基本思想就是将一个记录插入到已排好序得序列中,从而得到一个新得, 记录数增 1 得有序序列。 直接插入排序算法得伪代码称为InsertionSort,它得参数就是一个数组A[1、、n],包含了n 个待排序得数。用伪代码表示直接插入排序算法如下: InsertionSort (A) for i←2 ton do key←A[i]//key 表示待插入数 //Insert A[i] into thesortedsequence A[1、、i-1] j←i-1 while j>0 andA[j]>key do A[j+1]←A[j] j←j-1 A[j+1]←key 2、快速排序算法思想 快速排序算法得基本思想就是,通过一趟排序将待排序序列分割成独立得两部分,其中一 部分记录得关键字均比另一部分记录得关键字小,则可对这两部分记录继续进行排序,以达 到整个序列有序。 假设待排序序列为数组A[1、、n],首先选取第一个数A[0],作为枢轴(pivot),然后按照下述原则重新排列其余数:将所有比A[0]大得数都排在它得位置之前,将所有比 A[0]小得数都排在它得位置之后,由此以A[0]最后所在得位置i 作为分界线,将数组 A[1、、n]分成两个子数组A[1、、i-1]与A[i+1、、n]。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A[1、、i-1]与A[i+1、、n]排序。 一趟快速排序算法得伪代码称为Partition,它得参数就是一个数组A[1、、n]与两个指针low、high,设枢轴为pivotkey,则首先从high所指位置起向前搜索,找到第一个小于pivotkey得数,并将其移到低端,然后从low 所指位置起向后搜索,找到第一个大于pivotkey 得数,并将其移到高端,重复这两步直至low=high。最后,将枢轴移到正确得位置上。用伪代码表示一趟快速排序算法如下: Partition ( A,low,high) A[0]←A[low] //用数组得第一个记录做枢轴记录 privotkey←A[low] //枢轴记录关键字 while low<high //从表得两端交替地向中间扫描 while low=privotkey do high←high-1 A[low]←A[high] //将比枢轴记录小得记录移到低端 while low<high &&A[low]<=pivotkey)dolow←low+1 A[high]←A[low] //将比枢轴记录大得记录移到高端

数据结构实验报告九

数据结构实验报告 查找 1.实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法。 (2) 掌握二叉排序树的建立及查找。 查找是软件设计中的最常用的运算,查找所涉及到的表结构的不同决定了查找的方法及其性能。二分查找是顺序表的查找中的最重要的方法,应能充分理解其实现方法和有关性能,并能借助其判定树结构来加深理解。二叉排序树结构在实验时具有一定的难度,可结合二叉树的有关内容和方法来实现。 2.实验内容和要求 编写算法实现下列问题的求解。 (1) 对下列数据表,分别采用二分查找算法实现查找,给出查找过程依次所比较的元素(的下标),并以二分查找的判定树来解释。 第一组测试数据: 数据表为(1,2,3,4,6,7,8,9,10,11,12,13,17,18,19,20,24,25,26,30,35,40,45,50,,100) 查找的元素分别为:2,8,20, 30,50,5,15,33,110 第二组数据: 数据表为(2,3,5,7,8,10,12,15,18,20,22,25,30,35,40,45,50,55,60, 80,100) 查找的元素分别为:22,8,80,3,100,1,13,120 (2) 设计出在二叉排序树中插入结点的算法,在此基础上实现构建二叉排序树的算法。 测试数据:构建二叉排序树的输入序列如下: 第一组数据: 100,150,120,50,70,60,80,170,180,160,110,30,40,35,175 第二组数据: 100,70,60,80,150,120,50,160,30,40,170,180,175,35 (3) 设计算法在二叉排序树中查找指定值的结点。 测试数据:在任务<1>中第一组测试数据所构造的二叉排序树中,分别查找下列元素:150,70,160,190,10,55,175 (4) 设计算法在二叉排序树中删除特定值的结点。 测试数据:在任务(1)中第一组测试数据所构造的二叉排序树中,分别删除下列元素:30,150,100

排序算法实验报告

实验课程:算法分析与设计 实验名称:几种排序算法的平均性能比较(验证型实验) 实验目标: (1)几种排序算法在平均情况下哪一个更快。 (2)加深对时间复杂度概念的理解。 实验任务: (1)实现几种排序算法(selectionsort, insertionsort,bottomupsort,quicksort, 堆排序)。对于快速分类,SPLIT中的划分元素采用三者A(low),A(high),A((low+high)/2)中其值居中者。(2)随机产生20组数据(比如n=5000i,1≤i≤20)。数据均属于范围(0,105)内的整数。对于同一组数据,运行以上几种排序算法,并记录各自的运行时间(以毫秒为单位)。(3)根据实验数据及其结果来比较这几种分类算法的平均时间和比较次数,并得出结论。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1)明确实验目标和具体任务; (2)理解实验所涉及的几个分类算法; (3)编写程序实现上述分类算法; (4)设计实验数据并运行程序、记录运行的结果; (5)根据实验数据及其结果得出结论; (6)实验后的心得体会。 一:问题分析(包括问题描述、建模、算法的基本思想及程序实现的技巧等):1:随机生成n个0到100000的随机数用来排序的算法如下. for(int n=1000;n<20000;n+=1000) { int a[]=new int[n]; for(int i=0;i

数据结构实验报告(三):实现深度优先搜索与广度优先搜索算法

佛山科学技术学院 实验报告 课程名称数据结构 实验项目实现深度优先搜索与广度优先搜索算法 专业班级 10网络工程2 姓名张珂卿学号 2010394212 指导教师成绩日期 2011年11月16日 一、实验目的 1、通过本实验,掌握图,无向图的基本概念,掌握图的遍历; 2、掌握图的深度优先搜索(DFS)与广度优先搜索(BFS)算法。 二、实验内容 1、建立图的存储方式; 2、图的深度优先搜索算法; 3、图的广度优先搜索算法。 三、实验原理 图的遍历是图的算法中一种非常重要的算法,通过建立图的存储结构,采用深度优先搜索与广度优先搜索算法可以进行图的遍历; 深度优先遍历是树的先根遍历的推广,是将某一条枝上的所有节点都搜索到了之后,才转向搜索另一条枝上的所有节点; 广度优先遍历与深度优先遍历的区别在于:广度优先遍历是以层为顺序,将某一层上的所有节点都搜索到了之后才向下一层搜索。 四、实验步骤 1.建立图的存储结构; 2.输入图的基本接点与信息,初始化图; 3.编写图的深度优先搜索(DFS)和广度优先搜索算法(BFS)程序; 4.采用菜单形式进行显示与选择。 5.测试数据和结果显示 (1)从键盘输入顶点数和边数; (2)输入顶点信息; (3)输入边的信息,以(a,b)的形式输入边的信息,构建一个无向图; (4)对此无向图进行深度优先搜索和广度优先搜索,并输出正确的序列。 五、程序源代码及注释 /******************************* *采用邻接表的存储结构 *构建无向图 *图的创建过程中暂不支持重复验证,

因此不能对一条边进行重复定义 ******************************/ #include #include #include #define MAX_VERTEX_NUM 20 typedef struct ArcNode{ int adjvex; struct ArcNode* nextarc; //InfoType* info; }ArcNode; /********************************* *链表结点的结构用于创建栈或是队列 ********************************/ typedef struct LinkNode{ ArcNode* parc; //存储指针地址 struct LinkNode* next; //指向一下个结点 }LinkNode; typedef struct VNode{ char cData; //顶点元素值 ArcNode* firstarc; //指向第一条依附于该点的边}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum; //图的当前顶点数和弧数 int arcnum; }ALGraph; int Visited[MAX_VERTEX_NUM]; /********************************* *将生成的图打印出来以便确认正确性 ********************************/ int PrintCheck(ALGraph* pag) { int i; ArcNode* p;

实验报告

实验报告 实验题目:二叉树 实验目的: 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 基本要求: 1.编写程序bitree.cpp实现ADTBiTree,要求使用二叉链表存储。实现基本操作:InitBiTree(&T); DestroyBiTree(&T); PreOrder(T,visit()); InOrder(T,visit()); PostOrder(T,visit()); 2.编码实现以下算法: 1)创建二叉树。(以先序扩展序列给出) 2)输出先序、中序和后序序列。 3)计算二叉树结点数、叶子结点数、高度。 测试数据:先序扩展序列:ABDF##G##E#H##C##输出:先序ABDFGEHC中序FDGBEHAC后序FGDHEBCA结点数:8叶子结点数:4高度:4。

实验拓展 1)实现层次遍历。 2)查找:查值为X的结点、双亲结点、孩子结点、兄弟结点 3)判断:判断一个二叉树是否为二叉排序树、完全二叉树、平衡和二叉树 4)处理:左右子树互换、复制、删除子树、插入子树 设计思路: 1.在二叉树的存储结构为链式存储结构。 2.在具体实现的时候建立不同函数,在主程序中用循环菜单的形式调用函数提高了效率。 概要分析: 二叉链表结构定义: typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild; }BiNode,*BiTree; CreatBiTree(BiTree &T);先序建立二叉树。 DestroyBiTree(BiTree &T);销毁二叉树; PreOrder(BiTree &T);先序遍历二叉树 InOrder(BiTree &T);中序遍历二叉树 PostOrder (BiTree &T);后序遍历二叉树 PrintbyLev(BiTree &T);按层次遍历二叉树,利用队列的思想,从根结点开始将其放入一

(new)《数据结构与算法》上机实验要求

《数据结构与算法》课程实验内容与要求 一、 课程简介 本课程着重讲述①线性结构、树型结构、图等典型数据结构的逻辑特点、存储结构及其相应的基本算法。②各种查找算法③典型内部排序算法。 二、 实验的作用、地位和目的 数据结构是一门技术基础课,通过实验深刻理解各种逻辑结构、存储结构的特性,培养为实际问题分析其数据对象、基本操作,选择逻辑结构、存储结构灵活应用基本算法,设计出具有专业水准的应用程序的能力。 三、 实验方式与要求 ①首先要求学生在课下完成问题分析、算法设计,基本完成程序设计。 ②实验时,每位学生使用一台微机,独立调试,完成程序。 ③程序调试好后,由指导教师检测运行结果,并要求学生回答相关的问题。教师评出检查成绩。 ④学生记录程序的输入数据,运行结果及源程序。 ⑤在一周内完成实验报告。 四、 考核方式与实验报告要求 实验成绩由指导教师根据学生的实验完成情况、源程序质量、回答问题情况、实验报告质量、实验纪律等方面给分。 学生在实验后的一周内提交实验报告。实验报告按照附件中实验报告模版书写。实验报告中应包括如下内容: 实验内容按任课教师下达的实验任务填写(具体实验题目和要求); 实验过程与实验结果应包括如下主要内容: 数据结构定义 算法设计思路简介 算法描述:可以用自然语言、伪代码或流程图等方式 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等 算法时间复杂度分析 源程序清单与实验结果或其它说明可打印,并装订在实验报告之后。 实验报告雷同者,本次实验成绩为0分或雷同实验报告平分得分

五、 实验的软硬件环境 硬件环境:PⅡ以上微型计算机 软件环境:Windows98/2000, VC++6.0或turbo C 六、 实验内容安排 实验一线性表应用 实验时间:2017年3月9日1-2节(地点:7-219),3月10日5-6节(地点:7-215) 实验目的: 理解线性表的逻辑特点;掌握顺序表、链表存储结构,以及线性表的基本操作,如插入、删除、查找,以及线性表合并等操作在顺序存储结构和链式存储结构上的实现算法,并能够在实际问题背景下的灵活运用线性表来解决问题,实现相应算法。 每位同学可从下面题目中选择至少2题实现:其中第一题为必做题 1.一元稀疏多项式简单的计算器 1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器 2)要求: (1)采用单链表存储结构一元稀疏多项式 (2)输入并建立多项式 (3)输出多项式 (4)实现多项式加、减运算 3)分析算法时间复杂度 2. 约瑟夫环问题 1)问题描述:有编号为1, 2…n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始给定一个正整数m,从第一个人按顺时针方向自1开始报数,报到m者出列,不再参加报数,这时将出列者的密码作为m,从出列者顺时针方向的下一人开始重新自1开始报数。如此下去,直到所有人都出列。试设计算法,输出出列者的序列。 2)要求: 采用顺序和链式两种存储结构实现 3)分析算法时间复杂度 3.单链表基本操作练习 1)问题描述:在主程序中提供下列菜单: 1…建立链表 2…连接链表 3…输出链表 0…结束 2)实验要求:算法中包含下列过程,分别完成相应的功能: CreateLinklist(): 从键盘输入数据,创建单链表 ContLinklist():将前面建立的两个单链表首尾相连 OutputLinklist():输出显示单链表 3)分析算法时间复杂度

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