凸包生成算法实验报告

凸包生成算法实验报告
凸包生成算法实验报告

实验报告

班级:

学生姓名:

学号: 201101218

日期: 2014年5月11日

判断点线关系及计算多边形内角一、点与线的关系

(1)定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:|x1 x2 x3|

S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)

|1 1 1 |

当P1P2P3逆时针时S为正的,当P1P2P3顺时针时S为负的。

令矢量的起点为A,终点为B,判断的点为C,

如果S(A,B,C)为正数,则C在矢量AB的左侧;

如果S(A,B,C)为负数,则C在矢量AB的右侧;

如果S(A,B,C)为0,则C在直线AB上。

(2)算法

二、计算多边形内角

(1)算法过程

第一步:输入一系列的离散点;

第二步:找x坐标值最小的点p0,这样能确定由此点构成的多边形的角是凸的;

第三步:定义与p0点相邻的前后两个点p1,p2,若超出数组边界,则用首点或尾点取代;

第四步:计算p2与向量p1p0的位置关系,若p2在向量p1p0的左边,则多边形呈逆时针方向;若p2在向量p1p0的右边,则多边形呈顺时针方向。

第五步:计算多边形的各个内角,利用两个向量的夹角公式计算。由于多边形有凹凸性,所以算角时要分情况。找规律可知,若多边形是逆时针走向,那么,若三个相邻的点构成凸角,三点的走向始终是逆时针走向,否则,是顺时针走向,故可根据此来确定角度。

(2)算法实现

1

2

3

(3)算法结果

凸包生成算法

一、凸包定义

通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包。

二、Graham算法思想

概要:Graham算法的主要思想就是,最终形成的凸包,即包围所有点的凸多边形,假定多边形是按逆时针方向生成的,那么多边形内部包围的所有点与多边形每个有向边的关系都是:点在有向边的左边。依照此思想,只要找到一个出发点,然后依此出发点按逆时针方向构建多边形,并保证每加入一条有向边时,都要满足其余点都在该边的左边。

具体算法过程:

(1)输入:点集S={P}

(2)寻找基点P0:在所有点中找到y坐标最小的点,若找到多个,则选取其中X坐标最大的点作为基点,若只找到一个,则直接以这个点作为基点。

(3)排序:以基点为起点,以其余点为终点构成一个向量,逐个计算每个向量与x 轴正方向的夹角,并按夹角有小到大进行排序,得到一个排序的点S1={p0,p1,p2,p3…p(N-1)};对于夹角相同的点,剔除掉离基点近的点,只保留离基点最远的那个点。

注意:由于计算角度复杂且耗时,在这里采用另外一种方式处理,根据上面的点线关系,从基点p0出发,依次遍历其它点,设为pk,p0和pk就构成一条有向向量,依次判断其它点

(如pm)在向量的哪个方向,若在线段右边,则用其它点代替pk,构成一个新向量p0pm,继续判断剩余的点,这样一趟下来,就能找到最右边的点;依此道理判断其他点。如图:从向量p0p3(p3是任意选的,最终要将除p0外的所有点选到即可)开始,p1在向量p0p3左边,不变;p2在p0p3左边,向量不变;p4在p0p3右边,这时要将比较的向量变为p0p4;继续遍历p5,p5在p0p4右边,向量变为p0p5;继续遍历p6,p6在向量p0p5右边,向量变为p0p6;遍历p7,p7在向量p0p6右边,向量变为p0p7,这一趟下来就将p7这一个最右边的点找到了。同样的方法排序其他点,最后向量按与x轴正方向的顺序就是{p7,p6,p5,p4,p3,p2,p1},依次递增。

(4)构造凸包:

第一步:首先将基点p0入栈,p1和p2也依次入栈;

第二步:取栈顶的前两个点构成向量,即向量

第三步:判断点p(k+1)是否在向量的左边;

第四步:

情况1:若在向量的左边,则将点p(k+1)入栈,重复第二步;

情况2:若在向量的右边,将点pk出栈,继续取下一个点,重复步骤二。

第五步:最后栈中存储的点就为凸包。

三、编程实现

1、判断点p3是否在p1p2左边函数。

5、测试结果图

插入排序算法实验报告

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

实验一插入排序算法 一、实验性质设计 二、实验学时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); } } } Ⅳ、运行结果显示:

算法实验报告

华北电力大学 实验报告| | 实验名称算法设计与分析综合实验 课程名称算法设计与分析 | | 专业班级软件12 学生姓名: 学号:成绩: 指导教师:胡朝举实验日期:

实验一分治策略—归并排序 一、实验要求 (1)编写一个模板函数:template ,MergeSort(T *a, int n); 以及相应的一系列函数,采用分治策略,对任意具有:bool operator<(const T&x,const T&y);比较运算符的类型进行排序。 (2)与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。 二、实验代码 #include <> #include <> #include <> #include <> #define MAX 50 typedef struct { int arr[MAX+1]; int length; }SortArr; SortArr *CreateSortArr() { int i = 0; char buf[4*MAX] = ""; char *ptr = NULL; SortArr *sortArr = (SortArr *)malloc(sizeof(SortArr)); memset(sortArr, 0, sizeof(SortArr)); printf("请输入待排序数据,以逗号分隔,以分号结束\n" "input:"); scanf("%s", buf); ptr = buf; sortArr->arr[i] = 0; i = 1; while(*ptr != ';') { sortArr->arr[i] = atoi(ptr); i++; ptr = strstr(ptr, ","); if(!ptr) { break; } ptr++; } sortArr->length = (i - 1); return sortArr; } int merge(int arr[], int p, int q, int r) { int i = 0; int j = 0; int k = 0; int n1 = 0; int n2 = 0; int *leftArr = NULL; int *rightArr = NULL; n1 = q - p + 1; n2 = r - q;

《数据结构》实验报告——排序.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 次记录移动(赋值)的操作。而实际上,

排序操作实验报告

数据结构与算法设计 实验报告 (2016 — 2017 学年第1 学期) 实验名称: 年级: 专业: 班级: 学号: 姓名: 指导教师: 成都信息工程大学通信工程学院

一、实验目的 验证各种简单的排序算法。在调试中体会排序过程。 二、实验要求 (1)从键盘读入一组无序数据,按输入顺序先创建一个线性表。 (2)用带菜单的主函数任意选择一种排序算法将该表进行递增排序,并显示出每一趟排序过程。 三、实验步骤 1、创建工程(附带截图说明) 2、根据算法编写程序(参见第六部分源代码) 3、编译 4、调试 四、实验结果图 图1-直接输入排序

图2-冒泡排序 图3-直接选择排序 五、心得体会 与哈希表的操作实验相比,本次实验遇到的问题较大。由于此次实验中设计了三种排序方法导致我在设计算法时混淆了一些概念,设计思路特别混乱。虽然在理清思路后成功解决了直接输入和直接选择两种算法,但冒泡

排序的算法仍未设计成功。虽然在老师和同学的帮助下完成了冒泡排序的算法,但还需要多练习这方面的习题,平时也应多思考这方面的问题。而且,在直接输入和直接选择的算法设计上也有较为复杂的地方,对照书本做了精简纠正。 本次实验让我发现自己在算法设计上存在一些思虑不周的地方,思考问题过于片面,逻辑思维能力太过单薄,还需要继续练习。 六、源代码 要求:粘贴个人代码,以便检查。 #include #define MAXSIZE 100 typedef int KeyType; typedef int DataType; typedef struct{ KeyType key; DataType data; }SortItem,SqList[MAXSIZE]; /*******直接插入顺序表*******/ void InsertSort(SqList L,int n) { int i,j,x; SortItem p; for(i=1;i

算法实验报告

贵州大学计算机科学与技术学院 计算机科学与技术系上机实验报告 课程名称:算法设计与分析班级:软件101 实验日期:2012-10-23 姓名:学号:指导教师: 实验序号:一实验成绩: 一、实验名称 分治算法实验- 棋盘覆盖问题 二、实验目的及要求 1、熟悉递归算法编写; 2、理解分治算法的特点; 3、掌握分治算法的基本结构。 三、实验环境 Visual C++ 四、实验内容 根据教材上分析的棋盘覆盖问题的求解思路,进行验证性实验; 要求完成棋盘覆盖问题的输入、分治求解、输出。有余力的同学尝试消去递归求解。 五、算法描述及实验步骤 分治算法原理: 分治算法将大的分解成形状结构相同的子问题,并且不断递归地分解,直到子问题规模小到可以直接求解。 棋盘覆盖问题描述: 在一个2k x 2k个方格组成的棋盘中恰有一个方格与其他的不同称为特殊方格,想要求利用四种L型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖。

实验步骤: 1、定义用于输入和输出的数据结构; 2、完成分治算法的编写; 3、测试记录结构; 4、有余力的同学尝试不改变输入输出结构,将递归消除,并说明能否不用栈,直接消除递归,为什么? 六、调试过程及实验结果 详细记录程序在调试过程中出现的问题及解决方法。 记录程序执行的结果。

七、总结 对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。 通过对本实验的学习,对分治算法有了进一步的认识,对棋盘覆盖问题和其他分治问题进行了对比。 八、附录 源程序(核心代码)清单或使用说明书,可另附纸 ① #include #include using namespace std; int board[100][100],tile=1; void chessboard(int tr,int tc,int dr,int dc,int size)//tr 棋盘左上角方格的行号,tc棋盘左上角方格的列号。dr特殊方格所在的行号。dc特殊方格所在的列号。size棋盘的大小2^k. { int s; if(size==1) return ; int t=tile++; s=size/2; //覆盖左上角棋盘 if(dr=tc+s) chessboard(tr,tc+s,dr,dc,s); else { board[tr+s-1][tc+s]=t; chessboard(tr,tc+s,tr+s-1,tc+s,s); } ② //覆盖左下角子棋盘 if(dr>=tr+s&&dc=tr+s&&dc>=tc+s) chessboard(tr+s,tc+s,dr,dc,s); else { board[tr+s][tc+s]=t; chessboard(tr+s,tc+s,tr+s,tc+s,s); } } int main() { int k,tr,tc,size,i,j; cin>>k>>tr>>tc; size=pow(2,k); chessboard(0,0,tr,tc,size); for(i=0;i

算法排序问题实验报告

《排序问题求解》实验报告 一、算法的基本思想 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<<"排序之后的数组为:"<

算法程序设计实验报告

程序设计》课程设计 姓名:王 学号:20100034 班级:软件工程00 班 指导教师:王会青 成绩: 2010年 6 月 实验一.构造可以使n 个城市连接的最小生成树 专业:__软件工程___ 班级:__软件姓名:_王___ 学号:_20100034 完成日期:_2010/6/26 ________ 一、【问题描述】给定一个地区的n 个城市间的距离网,用Prim 算法或Kruskal 算法建立最小生成树,并计算得到的最小生成树的代价。 1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道

路,则将相应边的权值设为自己定义的无穷大值。 2 显示出城市间道路网的邻接矩阵。 3 最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。 4 输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal 算法→执行Prim 算法→输出最小生成树 二、【问题分析】 1. 抽象数据类型结构体数组的定义: #ifnd ef ADJACENCYMATRIXED// 防止该头文件被重复引用 #define ADJACENCYMATRIXED // 而引起的数据重复定义 #define INFINITY 32767 // 最大值∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef int VRType; // 权值,即边的值 typedef char InfoType; // 附加信息的类型,后面使用时会定义成一个指针 typedef char VertexType[MAX_VERTEX_NUM]; // 顶点类型 typedef enum {DG=1, DN, UDG, UDN} GraphKind; //{ 有向图,有向网,无向图,无向网} typedef struct ArcCell { VRType adj; //VRType 是顶点关系类型。对无权图,用1 或0 表示相邻否;对带权图,则为权值类型。 InfoType*info; // 该弧关系信息的指针

算法实验报告

算法分析与设计实验报告 学院:信息科学与工程学院 专业班级: 指导老师: 学号: 姓名:

目录 实验一:递归与分治 (3) 1.实验目的 (3) 2.实验预习内容 (3) 3.实验内容和步骤 (3) 4.实验总结及思考 (5) 实验二:回溯算法 (6) 1.实验目的: (6) 2.实验预习内容: (6) 3. 实验内容和步骤 (6) 4. 实验总结及思考 (9) 实验三:贪心算法和随机算法 (10) 1. 实验目的 (10) 2.实验预习内容 (10) 3.实验内容和步骤 (10) 4. 实验总结及思考 (13)

实验一:递归与分治 1.实验目的 理解递归算法的思想和递归程序的执行过程,并能熟练编写快速排序算法程序。 掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。 2.实验预习内容 递归:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 分治:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 3.实验内容和步骤 快速排序的基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 源代码: #include using namespace std; int num; void swap(int &a,int &b) { int temp=a; a=b; b=temp; } void printarray(int *arr) { for (int i=1;i<=num;++i) cout<

Romberg龙贝格算法实验报告.

Romberg龙贝格算法实验报告 2017-08-09 课程实验报告 课程名称: 专业班级: CS1306班学号: U201314967 姓名:段沛云指导教师:报 告日期: 计算机科学与技术学院 目录 1 实验目的 (1) 2 实验原理 (1) 3 算法设计与流程框图 (2) 4 源程序 (4) 5 程序运行 (7) 6 结果分析 (7) 7 实验体会 (7) 1 实验目的 掌握Romberg公式的用法,适用范围及精度,熟悉Romberg算法的流程,并能够设计算法计算积分 31 得到结果并输出。 1x 2 实验原理 2.1 取k=0,h=b-a,求T0= 数)。 2.2 求梯形值T0( b-a

),即按递推公式(4.1)计算T0。 k 2 h [f(a)+f(b)],令1→k,(k记区间[a,b]的二分次2 2.3 求加速值,按公式(4.12)逐个求出T表的第k行其余各元素Tj(k-j) (j=1,2,….k)。 2.4 若|Tk+1-Tk| n-1 11T2n=[Tn+hn∑f(xi+)] 22i=0 1 Sn=T2n+(T2n-Tn) 31 Cn=S2n+(S2n-Sn) 151 Rn=C2n+(C2n-Cn) 63 3 算法设计与流程框图 算法设计:(先假定所求积分二分最大次数次数为20) 3.1 先求T[k][0] 3.2 再由公式T (k)m 4m(k+1)1)=mTm-1-mTm(k-1(k=1,2,) 求T[i][j] 4-14-1 3.3 在求出的同时比较T[k][k]与T[k-1][k-1]的大小,如果二者之差的绝对 值小于1e-5,就停止求T[k][k];此时的k就是所求的二分次数,而此时的T[k][k]就是最终的结果 3.4 打印出所有的T[i][j];程序流程图

算法排序问题实验报告

《排序问题求解》实验报告 一、算法得基本思想 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] //将比枢轴记录大得记录移到高端

微机原理实验报告-冒泡排序

WORD格式 一、实验目的 (1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。 (2)理解并掌握各种指令的功能,编写完整的汇编源程序。 (3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。 二、实验内容及要求 (1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。(2)实验要求: ①编制程序,对这组数进行排序并输出原数据及排序后的数据; ②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化; ③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值; ④用压栈PUSH和出栈POP指令,将平均值按位逐个输出; ⑤将平均值转化为二进制串,并将这组二进制串输出; ⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。 三、程序流程图 开 始(1)主程序:MAIN 初始化 键盘输入数据 调用INPUT子程序 显示输入错误 否 输入是否正确 是 显示原始数据 调用OUTPUT子程序

WORD格式 显示冒泡排序后的数据 调用SORT子程序 调用OUTPUT子程序 显示最小值Min 显示One子程序 显示最大值Max 调用One子程序 显示其余数平均值Average 调用One子程序 显示平均值二进制串Binary 调用One子程序 结束

(2)冒泡排序子程序:SORT COUNT1----外循环次数 进入COUNT2----内循环次数 i----数组下标 初始化 COUNT1=N-1 COUNT2=COUNT1 SI=0 否 Ai≥i A+1 是 Ai与A i+1两数交换 SI=SI+2 COUNT2=COUNT2-1 否 COUNT2=0? 是 COUNT1=COUNT1-1 否 COUNT2=0? 是 返回

排序算法实验报告

实验课程:算法分析与设计 实验名称:几种排序算法的平均性能比较(验证型实验) 实验目标: (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

排序算法实验报告

数据结构实验报告 八种排序算法实验报告 一、实验内容 编写关于八种排序算法的C语言程序,要求包含直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。 二、实验步骤 各种内部排序算法的比较: 1.八种排序算法的复杂度分析(时间与空间)。 2.八种排序算法的C语言编程实现。 3.八种排序算法的比较,包括比较次数、移动次数。 三、稳定性,时间复杂度和空间复杂度分析 比较时间复杂度函数的情况:

时间复杂度函数O(n)的增长情况 所以对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法。 时间复杂度来说: (1)平方阶(O(n2))排序 各类简单排序:直接插入、直接选择和冒泡排序; (2)线性对数阶(O(nlog2n))排序 快速排序、堆排序和归并排序; (3)O(n1+§))排序,§是介于0和1之间的常数。 希尔排序 (4)线性阶(O(n))排序 基数排序,此外还有桶、箱排序。 说明: 当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O(n); 而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O(n2); 原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。 稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以避免多余的比较; 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

银行家算法_实验报告

课程设计报告课程设计名称共享资源分配与银行家算法 系(部) 专业班级 姓名 学号 指导教师 年月日

目录 一、课程设计目的和意义 (3) 二、方案设计及开发过程 (3) 1.课题设计背景 (3) 2.算法描述 (3) 3.数据结构 (4) 4.主要函数说明 (4) 5.算法流程图 (5) 三、调试记录与分析 四、运行结果及说明 (6) 1.执行结果 (6) 2.结果分析 (7) 五、课程设计总结 (8)

一、程设计目的和意义 计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 二、方案设计及开发过程 1.课题设计背景 银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待 2.算法描述 1)如果Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi 需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 2)如果Requesti[j]<=Available[j],便转向步骤3,否则,表示尚无足够资源,进程Pi须等待。 3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]:=Available[j]-Requesti[j]; Allocation[i,j]:=Allocation[i,j]+Requesti[j]; Need[i,j]:=Need[i,j]-Requesti[j];

概率论实验报告蒙特卡洛方法估计积分值

概率论实验报告 ——蒙特卡洛方法估计积分值 姓名: 学号: 班级: 实验内容:用蒙特卡洛方法估计积分值 1用蒙特卡洛方法估计积分 20sin x xdx π ?,2-0x e dx +∞?和 22221x y x y e dxdy ++≤??的值,并将估 计值与真值进行比较。 2用蒙特卡洛方法估计积分 21 0x e dx ? 和 22x y +≤??的值, 并对误差进行估计。 要求:(1)针对要估计的积分选择适当的概率分布设计蒙特卡洛方法; (2)利用计算机产生所选分布的随机数以估计积分值; (3)进行重复试验,通过计算样本均值以评价估计的无偏性;通过计算均方误差(针对第1类题)或样本方差(针对第2类题)以评价估计结果的精度。 目的:(1)能通过 MATLAB 或其他数学软件了解随机变量的概率密度、分布函数及其期望、方差、协方差等; (2) 熟练使用 MATLAB 对样本进行基本统计,从而获取数据的基本信息; (3) 能用 MATLAB 熟练进行样本的一元回归分析。 实验一、估计2 sin x xdx π ?的值,并将估计值与真值进行比较。 MATLAB 代码: s=0;m=0;f=0;r=0;n=50; h(1:10)=0; for j=1:10 for i=1:n a=unifrnd(0,pi/2,n,1); x=sort(a); y=pi/2*mean(x.*sin(x)); s=s+y; end b=s./n; fprintf('b=%.4f\n',b); h(j)=b;

s=0; m=m+b; end p=m./10 z=1 for j=1:10 r=(h(j)-z).^2; f=f+r; end f=f./10; fprintf('f=%.6f\n',f) 运行结果: b=1.0026 b=1.0061 b=1.0037 b=1.0135 b=0.9932 b=0.9988 b=1.0213 b=1.0310 b=0.9813 b=1.0041 p = 1.0056 z = 1 f=0.000207 >> (运行截图) 结果显示f=0.000207,表明估计结果与理论值非常接近。 实验二、估计 2-0x e dx +∞ ?的值,并将估计值与真值进行比较。 I=dx e x ?+∞-02=1/2*pi dx e pi e x x *2***2/1*2/2/22-+∞ ∞--? =)(x f x 2/2**2/1x e pi - g(x)=e pi x *2*2/2- )(x f x 为标准正态分布的概率密度.分别取10个估计值h(j),求得估计值的均值p ,对照积分的真实值求得估计均方误差f 。

算法实验报告

云南大学信息学院 计算机科学与技术专业本科《算法设计与分析》 专业:计算机科学与技术 教师:岳昆老师 姓名:张涛 学号:20121120119 2014年12月26 日

实验一算法计算时间复杂度和增长率 (4) 1、实验目的 (4) 2、基本思想 (4) 3、设计与实现的关键技术和主要方法 (4) 4、实验环境 (4) 5、实验结果与结论 (4) 5.1实验结果: (4) 5.2结论: (5) 实验二搜索算法的实现,时间复杂度分析与测试 (6) 1、实验目的 (6) 2、基本思想 (6) 3、设计与实现的关键技术和主要方法 (6) 4、实验环境 (6) 5、实验结果与结论 (6) 5.1实验结果 (6) 5.2结论 (8) 实验三分治算法的递归程序实现与时间复杂度测试 (9) 1、实验目的 (9) 2、基本思想 (9) 3、设计与实现的关键技术和主要方法 (9) 4、实验环境 (9) 5、实验结果与结论 (9) 5.1实验结果: (9) 5.2结论 (10) 实验四动态规划算法的实现与时间复杂度测试 (11) 1、实验目的 (11) 2、基本思想 (11) 3、设计与实现的关键技术和主要方法 (11) 4、实验环境 (11) 5、实验结果与结论 (11) 5.1实验结果: (11) 5.2结论 (12) 实验五动态规划算法的适应性测试 (12) 1、实验目的 (13) 2、基本思想 (13) 3、设计与实现的关键技术和主要方法 (13) 4、实验环境 (13) 5、实验结果与结论 (13) 5.1实验结果 (13) 5.2结论 (14) 实验六贪心算法的实现与时间复杂度测试 (14) 1、实验目的 (15) 2、基本思想 (15)

数据结构与算法实验报告册

. . 河南工程学院 理学院学院 实验报告 (数据结构与算法) 学期: 课程: 专业: 班级: 学号: 姓名: 指导教师:

. . 目录 实验一线性表1(顺序表及单链表的合并) (1) 实验二线性表2(循环链表实现约瑟夫环) (1) 实验三栈和队列的应用(表达式求值和杨辉三角) (1) 实验四赫夫曼编码 实验五最小生成树 (1) 实验六排序算法

. . 实验一线性表1 一、实验学时:2学时 二、实验目的 1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系。在计算机中 表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。 2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储 结构上的实现。 三、实验内容 1. 编写程序,实现顺序表的合并。 2. 编写程序,实现单链表的合并。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 1. 顺序表合并的基本思想 程序流程图: 2. 单链表合并的基本思想 程序流程图 六、程序清单

. 七、实现结果 .

. 八、实验体会或对改进实验的建议.

. . 实验二线性表2 一、实验学时:2学时 二、实验目的 1.了解双向循环链表的逻辑结构特性,理解与单链表的区别与联系。 2.熟练掌握双向循环链表的存储结构以及基本操作。 三、实验内容 编写程序,采用循环链表实现约瑟夫环。 设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 约瑟夫环实现的基本思想 程序流程图: 六、程序清单

算法设计与分析实验报告

本科实验报告 课程名称:算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真 指导教师:郝晓丽 2018年05月04 日

实验一递归与分治算法 1.1 实验目的与要求 1.进一步熟悉C/C++语言的集成开发环境; 2.通过本实验加深对递归与分治策略的理解和运用。 1.2 实验课时 2学时 1.3 实验原理 分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。 需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。 1.4 实验题目 1.上机题目:格雷码构造问题 Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。 对于给定的正整数n,格雷码为满足如下条件的一个编码序列。 (1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2)序列中无相同的编码。 (3)序列中位置相邻的两个编码恰有一位不同。 2.设计思想: 根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011

010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:

相关文档
最新文档