实验六、DEM的建立与应用

实验六、DEM的建立与应用
实验六、DEM的建立与应用

成都信息工程学院

《地理信息系统原理》实验指导

实验六、DEM的建立与应用

1实验目的

1)巩固学生掌握格网DEM模型及DEM应用;

2)熟悉ArcGis 中栅格数据的拼接和裁剪;

3)熟悉ArcGis 中坡度、坡向等地型属性的提取操作;

4)熟悉ArcGis中地形透视图的建立;

5)了解ArcGis中等高线的提取、剖面图的创建等操作。

2实验软件及数据

2.1实验软件

ArcCatalog 10、ArcMap 10、ArcScene 10。

2.2实验数据

1)四川省范围的高程数据压缩文件6个;

2)四川省边界数据(面图层)、四川省地州界(面图层)、四川省主要河流;

3)四川省年降水量栅格数据。

3实验步骤

3.1DEM数据下载及拼接

目的:下载指定区域的DEM数据,将下载的多个数据进行拼接,并按指定的边界进行提取。

1)数据下载

根据你研究的区域,从“https://www.360docs.net/doc/c33500846.html,/”下载。

数据服务平台中,DEM数字高程包括SRTM90米分辨率原始高程数据和30米分辨率数字高程数据产品。SRTM90米分辨率原始高程数据、30米分辨率数字高程数据产品。

其中,SRTM由美国太空总署(NASA)和国防部国家测绘局(NIMA)联合测量。2000年2月11日,美国发射的“奋进”号航天飞机上搭载SRTM系统,SRTM系统获取的雷达影像的数据量约9.8万亿字节,经过两年多的数据处理,制成了数字地形高程模型(DEM),即现在的SRTM地形产品数据。目前的数据修订版本为V4.1版本。该版本由CIAT(国际热带农业中心)利用新的插值算法得到的SRTM地形数据,此方法更好的填补了SRTM 90的数据空洞。

本实验需下载四川省区域90米高程数据产品数据。在

数据检索中可通过输入经纬度范围或通过图形交互查询数

据文件。

如输入四川省的经纬度范围,则查询出需要下载6个

文件。

如果下载30米的DEM数据,其文件为压缩文件,每个压缩包内包含三个文件,即数字高程模型(-_dem)文件、质量评估(-_num)文件和高程快视图(_jpg)文件。

2)DEM数据拼接

(1)打开ArcMap中,将数据框更名为“任务1”。

(2)将所有的数字高程模型文件加载到ArcMap中(共6个文件)。

问题:为什么9个DEM数据的相接处的显示有很明显的分界?

(3)镶嵌

镶嵌是指两个或多个图像的组合或合并。在ArcGIS 中,您可以通过将多个栅格数据集镶嵌到一起来创建一个单个栅格数据集。此外,还可以通过一系列栅格数据集创建镶嵌数据集和虚拟镶嵌。

使用ArcToolbox中Data Management Tools(数据管

理工具)/Raster(栅格)/Raster Dataset(栅格数据

集)/Mosaic(镶嵌)或Mosaic To New Raster(镶嵌至新栅格)

进行拼接。

如运行“镶嵌至新栅格”,输入下载的多个DEM数

据、输出的位置(已经存在的目录)和合并后的栅格数

据文件名,波段数据设置为1。

如果选择“镶嵌”,则合并到第一个栅格文件中。

镶嵌完成,得到如下结果,并把其它的图层移除。

问题:镶嵌后是什么坐标系统?共有多少行和列?

3)栅格数据裁剪

合并后的DEM数据可能与研究区域不重合,需要根据边界对DEM数据进行裁剪,如将上面拼接的结果,按四川省边界图层进行提取。

(1)加入四川省边界图层。

(2)使用ArctoolsBox/Spatial Analyst Tools(空间分析工具)/Extraction(提取

提取的结果文件命名为四川省90米DEM。(数据将用

于后续实验任务)。

结果如下:

问题:ArcGis中除了可以按掩膜提取外,还可以按什么方式提取?

3.2地形属性的提取

目的:从DEM数据中,提取研究区的坡度、坡向、地表曲率等地形属性。

1)坡度提取

ArcGis中坡度工具用于为每个像元计算值在从该像元到与其相邻的像元方向上的最大变化率。实际上,高程随着像元与其相邻的八个像元之间距离的变化而产生的最大变化率可用来识别自该像元开始的最陡坡降。

该工具会将一个平面与要处理的像元或中心像元周围一个 3 x 3 的像元邻域的z 值进行拟合。该平面的坡度值通过最大平均值法来计算(请参阅参考书目)。该平面的朝向就是待处理像元的坡向。坡度值越小,地势越平坦;坡度值越大,地势越陡峭。

(1)启动ArcMap,添加数据框,并更名为“任务2”,将四川省90米DEM (任务1得到的结果栅格图层)加入。

(2)使用ArcToolbox中Spatial

Analyst Tools(空间分析工具)

/Surface(表面分析)工具集中Slope

(坡度)工具提取坡度。

问题:怎样把坡度25度以上的

地方查找出来?

2)坡向提取

坡向用于识别出从每个像元到其相邻像元方向上值的变化率最大的下坡方向。坡向可以被视为坡度方向。输出栅格中各像元的值可指示出各像元位置处表面的朝向的罗盘方向。将按照顺时针方向进行测量,角度范围介于0(正北)到360(仍是正北)之间,即完整的圆。

使用ArcToolbox中Spatial Analyst Tools/Surface工具集中Aspect(坡向)工具提取坡向。

提取的结果如下:

3)表面曲率提取

曲率工具会逐个像元地计算输入表面的二阶导数值。曲率工具的输出是该表面的二阶导数(例如,坡度的坡度),从应用的角度看,该工具的输出可用于描述流域盆地的物理特征,从而便于理解侵蚀过程和径流形成过程。坡度会影响下坡时的总体移动速率。坡向将决定流向。剖面曲率将影响流动的加速和减速,进而将影响到侵蚀和沉积。平面曲率会影响流动的汇聚和分散。

使用ArcToolbox中Spatial Analyst Tools空间分析工具/Surface表面分析工具集中Curvature工具提取表面曲率。

通过点击图层右键,选择属性中的符

号系统,显示方式设置为已分类,并设置

分类中的类别数量及中断值,将其显示为

<=-0.5,-0.5至0,0至0.5,>0.5总4个

级次。

3.3透视图的建立

目的:使用DEM数据建立透视图。

1)打开ArcScene,将场景名改为“任务3”,并将四川省90米DEM数据加

载到视图中。

并通过Properties(右键属性)中BaseHeights(基本高度)栏中,选择Obtain

heights for layer

from surface,选

择DEM数据为地

表抬升高度数据。

转换系数设

置为8,表示抬

升高度(米)是

实际高度的8倍。

2)修改显示符号系统

在符号系统中,选择拉伸方式显示,并设置色带为Elevation #1。

3)设置渲染

在Rendering(渲染)栏中进行渲染,设置光照效果。

4)将其它图层(栅格或矢量)数据按地形高度进行抬升。

将四川省地州界及四川省主要公路图层加入场景。并设置四川省地州界及四川省主要公路图层的基本高度参数。

附加:

将四川省气象站点的温度插值栅格图层(实验五的结果)加在场景中,并以DEM为基础高程抬升(结果见下图)。

3.4建立和显示TIN(增强训练1)

目的:将栅格DEM转为TIN。

ArcGis中栅格转TIN 工具的用途是创建表面偏离输入栅格不超过指定Z 容差的不规则三角网(TIN)。

1)启动ArcMap,添加数据框,并更名为“任务4”,将四川省90米DEM(任务1得到的结果栅格图层)加入。

2)使用ArcToolbox中3D Analyst工具/转换工具/栅格转TIN进行转换。

其中:

(1)z_tolerance(可选),输入栅格与输出TIN 之间所允许的最大高度差(z 单位)。默认情况下,z容差是输入栅格z 范围的1/10。如果指定的Z 值容差较小或者栅格表面在地形构造方面很粗糙复杂,则需要更多的点来构建TIN。

(2)max_points(可选),将在处理过程终止前添加到TIN 的最大点数。默认情况下,该过程将一直持续到所有点被添加完。如果已指定,则点的最大数量将作为TIN 的大小限制。如果在TIN 结点计

数达到此限制时,仍不符合Z 容差,则该工具将会停止,并返回操作失败。

(3)z_factor(可选),输入TIN 的高度转换为输出TIN 的高度时所乘的系数。用于将z 单位转换为x 和y 单位。

3)修改符号系统显示方式,添加渲染器。

问题:修改Z容差值及最多点数,查看转换后的TIN组成。3.5创建等高线图层(增强训练2)

目的:创建等高线图层。

1)启动ArcMap,添加数据框,并更名为“任务5”,将四川省90米DEM(任务1得到的结果栅格图层)加入。

2)使用ArcToolbox中Spatial Analyst Tools空间分析工具/Surface 表面分析工具集中等值线Contour工具提取表面等值线。也可以使用ArcToolbox中3D Analyst工具/栅格表面/等值线工具。

注意:路径、文件名最好用英文字母,不要太深、不要有特殊字符,比如括号么、“-”等。

起始等值线可用作起点或参考,其他所有等值线(包括正等值线和负等值线)都将从该条等值线派生出来。起始等值线的默认值为0.0。如果输入5.0 作为等值线间距,则可生成0、5、10 等正值,以及0、-5、-10 等负值。实际生成的等值线将取决于此间距模式与输入terrain 数据集或TIN

的实际z 范围间距模式的叠

加。如果将起始等值线值指定

为0.1,使用相同的间距 5.0,

则等值线模式将变为0.1、5.1、

10.1 等正值以及-4.9、-9.9、

-14.9 等负值。

3)标注等高线值

使用在属性选项中标注等高线的值,选择Contour为标注字段。

3.6垂直剖面图创建(增强训练3)

目的:创建等高线图层。

1)启动ArcMap,添加数据框,并更名为“任务6”,将四川省90米DEM(任务1得到的结果栅格图层)加入。

2)加入四川省主要公路图层。

3)创建剖面图

(1)打开3D Analyst工具栏。

(2)选择3D Analyst工具栏中的“插入线Interpolate Line”功能,使用鼠标沿一段主要公路划出创建垂直剖面图经过的点的线。

(3)使用3D Analyst工具栏中的创建剖面图Create Profile Graph 工具,创建沿划线经过点的剖面图。通过属性和高级属性修改显示样式。

3.7坡度分级(增强训练4)

目的:分析四川省坡度小于等于10、10至20、大于20度各类点的百分之,并估算其面积。

1)启动ArcMap,添加数据框,并更名为“任务7”,将四川省坡度图层(任务2提取的坡度图层)加入。

2)使用重分类功能,分为三类,将中断值改为10、20。

3)通过属性表进行计算三类中的

点数。

问题:面积怎样估算?

4实验要求

1)使用ArcGIs桌面系统完成以上步骤(至少完成3.1至3.3)2)完成以上步骤实验,并回答问题,附实验结果数据

3)按照实验模板要求撰写实验报告,及时通过网络教学平台提交。

插入排序算法实验报告

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

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

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

排序综合实验报告

数据结构 排序算法综合实验报告 姓名: xx x x 班级: 10电信1 学号: xxx 指导老师:胡圣荣 日期: 2012.12.15~2013.1.5 华南农业大学工程学院

算法基本思想: 1、插入排序:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中的适当位置,直到全部记录插入完毕为止。 (1)直接插入排序:在排序过程中,每次都讲无序区中第一条记录插入到有序区中适当位置,使其仍保持有序。初始时,取第一条记录为有序区,其他记录为无序区。显然,随着排序过程的进行,有序区不断扩大,无序区不断缩小。最终无序区变为空,有序区中包含了所有的记录,排序结束。 (2)希尔排序:将排序表分成若干组,所有相隔为某个“增量”的记录为一组,在各组进行直接插入排序;初始时增量d1较大,分组较多(每组的记录数少),以后增量逐渐减少,分组减少(每组的记录数增多),直到最后增量为1(d1>d2>...>dt=1),所有记录放为一组,再整体进行一次直接插入排序。 2、交换排序:每次比较两个待排序的记录,如果发现他们关键字的次序与排序要求相反时就交换两者的位置,直到没有反序的记录为止。 (1)冒泡排序:设想排序表R[1]到R[n]垂直放置,将每个记录R[i]看作是重量为R[i].key 的气泡;根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡违反本原则的轻气泡,就使其向上“漂浮”,如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 (2)快速排序:在待排序的n个记录中任取一个作为“基准”,将其与记录分为两组,第一组中个记录的键值均小于或等于基准的键值,第二组中个记录的键值均大于或等于基准的键值,而基准就排在这两组中间(这也是该记录的最终位置),这称为一趟快速排序(或一次划分)。对所分成的两组重复上述方法,直到所有记录都排在适当位置为止。 3、选择排序:每次从待排序的记录中选出关键字最小(或最大)的记录,顺序放在已排好序的子序列的后面(或最前),直到全部记录排序完毕。 (1)直接选择排序:首先,所有记录组成初始无序区R[1]到R[n],从中选出键值最小的记录,与无序区第一个记录R[1]交换;新的无序区为R[2]到R[n],从中再选出键值最小的记录,与无序区第一个记录R[2]交换;类似,第i趟排序时R[1]到R[i-1]是有序区,无序区为R[i]到R[n],从中选出键值最小的记录,将它与无序区第一个记录R[i]交换,R[1]到R[i]变为新的有序区。因为每趟排序都使有序区中增加一个记录,所以,进行n-1趟排序后,整个排序表就全部有序了。 (2)堆排序:利用小根堆(或大根堆)来选取当前无序区中关键字最小(或最大)的记录来实现排序的。下面介绍利用大根堆来排序。首先,将初始无序区调整为一个大根堆,输出关键字最大的堆顶记录后,将剩下的n-1个记录在重建为堆,于是便得到次小值。如此反复执行,知道全部元素输出完,从而得到一个有序序列。 4、并归排序:指将若干个已排序的子表合成一个有序表。 (1)二路并归排序:开始时,将排序表R[1]到R[n]看成n个长度为1的有序子表,把这些子表两两并归,便得到n/2个有序的子表(当n为奇数时,并归后仍是有一个长度为1的子表);然后,再把这n/2个有序的子表两两并归,如此反复,直到最后得到一个程度为n的

算法排序问题实验报告

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

数据结构实验报告-排序

本章共8道实验题目。 一、直接插入排序 1. 定义顺序表的存储结构 2. 初始化顺序表为空表 3. 输入10个元素创建含有10个元素的顺序表 4. 输出顺序表 5. 对顺序表进行直接插入排序(InsertSort) 6. 输出排序后的顺序表 例如: 11 938 669 507 117 261 708 343 300 602 11 938 669 507 117 261 708 343 300 602 11 117 261 300 343 507 602 669 708 938 程序: #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSIZE 100 typedef int KeyType; typedef char InfoType[256]; typedef struct { KeyType key; InfoType otherinfo; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length; }SqList; //此处定义直接插入排序函数 int a[20]; int main()

{ int InsertSort; for (int i = 0; i < 10; ++i) { cin >> a[i]; cout << a[i] << " "; } cout << endl; sort(a, a+10); for (int i = 0; i < 10; ++i) cout << a[i] << " "; return 0; } 二、折半插入排序 1. 定义顺序表的存储结构 2. 初始化顺序表为空表 3. 输入10个元素创建含有10个元素的顺序表 4. 输出顺序表 5. 对顺序表进行折半插入排序(BInsertSort) 6. 输出排序后的顺序表 例如: 11 938 669 507 117 261 708 343 300 602 11 938 669 507 117 261 708 343 300 602 11 117 261 300 343 507 602 669 708 938 程序: #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSIZE 100 typedef int KeyType; typedef char InfoType[256];

排序问题实验报告

2010级数据结构实验报告 实验名称:排序 姓名:袁彬 班级: 2009211120 班内序号: 09 学号: 09210552 日期: 2010 年12 月19 日 1.实验要求 试验目的: 通过选择试验内容中的两个题目之一,学习、实现、对比各种排序的算法,掌握各种排序算法的优缺点,以及各种算法使用的情况。 试验内容: 题目一: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: ①插入排序; ②希尔排序 ③冒泡排序; ④快速排序; ⑤简单选择排序; ⑥堆排序 ⑦归并排序 ⑧基数排序 ⑨其他。 具体要求如下: ①测试数据分为三类:正序,逆序,随机数据。 ②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。 ③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 ④对②和③的结果进行分析,验证上述各种算法的时间复杂度。 ⑤编写main()函数测试各种排序算法的正确性。 题目二: 使用链表实现下面各种排序算法,并进行比较。 排序算法如下: ①插入排序; ②冒泡排序; ③快速排序;

④简单选择排序; ⑤其他。 具体要求如下: ①测试数据分为三类:正序,逆序,随机数据。 ②对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换记为三次移动)。 ③对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙(选作) ④对②和③的结果进行分析,验证上述各种算法的时间复杂度。 ⑤编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构 程序中每一个算法均是用一个类来表示的,类中有自己的构造函数、排序函数。 程序的储存结构采用数组。数组的第一个位置不存储数据。数据从第二个位置开始。数组中的相对位置为数组的下标。 2.2 关键算法分析 ㈠、关键算法: 1、插入排序函数:Insert s ort(int n) ①、从2开始做循环,依次和前面的数进行比较:for(int i=2;i<=n;i++) ②、如果后面的比前面的小,则进行前移:if(number[i]=1;d=d/2) ②、在自己的间隔中进行简单插入排序,进行循环:for(int i=d+1;i<=n;i++) ③、如果后面的数据比前面的小,进行前移:if(number[i]0;j=j-d) ⑥、大的数据后移:number[j+d]=number[j]; ⑦、哨兵归位:number[j+d]=number[0]; 3、冒泡排序函数:Bubble s ort(int n) ①、设置有序无序的边界点:int pos=n; ②、当边界点不为空进行循环:while(pos!=0) ③、边界点传递给bound:int bound=pos; ④、从开始到边界点进行循环:for(int i=1;inumber[i+1]) ⑥、交换:number[0]=number[i];number[i]=number[i+1];number[i+1]=number[0]; ⑦、从小设置边界点:pos=i; 4、一趟快速排序函数:partion(int first,int end) ①、传递设置整个数据的起点和终点:int i=first;int j=end; ②、设置中轴:number[0]=number[i]; ③、当end大于first进行循环:while(i

大数据结构实验四题目一排序实验报告材料

数据结构实验报告 实验名称:实验四——排序 学生姓名:XX 班级: 班内序号: 学号: 日期: 1.实验要求 实验目的: 通过选择实验内容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 题目1: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: 1、插入排序; 2、希尔排序; 3、冒泡排序; 4、快速排序; 5、简单选择排序; 6、堆排序; 7、归并排序; 8、基数排序(选作); 9、其他。 具体要求如下: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关 键字交换记为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。 5、编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构

存储结构:数组 2.2 关键算法分析 一、关键算法: 1、插入排序 a、取排序的第二个数据与前一个比较 b、若比前一个小,则赋值给哨兵 c、从后向前比较,将其插入在比其小的元素后 d、循环排序 2、希尔排序 a、将数组分成两份 b、将第一份数组的元素与哨兵比较 c、若其大与哨兵,其值赋给哨兵 d、哨兵与第二份数组元素比较,将较大的值赋给第二份数组 e、循环进行数组拆分 3、对数据进行编码 a、取数组元素与下一个元素比较 b、若比下一个元素大,则与其交换 c、后移,重复 d、改变总元素值,并重复上述代码 4、快速排序 a、选取标准值 b、比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后 指针前移,重新比较 c、否则后面元素赋给前面元素 d、若后指针元素小于标准值,前指针后移,重新比较 e、否则前面元素赋给后面元素 5、简单选择排序 a、从数组中选择出最小元素 b、若不为当前元素,则交换 c、后移将当前元素设为下一个元素 6、堆排序 a、生成小顶堆 b、将堆的根节点移至数组的最后 c、去掉已做过根节点的元素继续生成小顶堆

查找排序实验报告

《编程实训》 实验报告书 专业:计算机科学与技术 班级:151班 学号: 姓名: 指导教师: 日期:2016年6月30日

目录 一、需求分析 (3) 1.任务要求 (3) 2.软件功能分析 (3) 3.数据准备 (3) 二、概要设计 (3) 1.功能模块图 (4) 2.模块间调用关系 (4) 3.主程序模块 (5) 4.抽象数据类型描述 (5) 三、详细设计 (6) 1.存储结构定义 (6) 2.各功能模块的详细设计 (7) 四、实现和调试 (7) 1.主要的算法 (7) 2.主要问题及解决 (8) 3.测试执行及结果 (8) 五、改进 (9) 六、附录 (9) 1.查找源程序 (9) 2.排序源程序 (9)

目录 1 需求分析 1.1 任务要求 对于从键盘随机输入的一个序列的数据,存入计算机内,给出各种查找算法的实现; 以及各种排序算法的实现。 1.2 软件功能分析 任意输入n个正整数,该程序可以实现各类查找及排序的功能并将结果输出。 1.3 数据准备 任意输入了5个正整数如下: 12 23 45 56 78 2 概要设计(如果2,3合并可以省略2.4) 2.1 功能模块图(注:含功能说明) 2.2 模块间调用关系 2.3 主程序模块 2.4 抽象数据类型描述 存储结构:数据结构在计算机中的表示(也称映像)叫做物理结构。又称为存储结构。数据类型(data type)是一个“值”的集合和定义在此集合上的一组操作的总称。 3 详细设计 3.1 存储结构定义 查找: typedef int ElemType ; //顺序存储结构 typedef struct { ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,号单元留空 int length; //表的长度

各种排序实验报告

【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。 为了运行时的方便,将八种排序方法进行编号,其中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、设计一个程序e xp10—1.cpp实现直接插入排序算法,并输出{9,8,7,6,5,4,3,2,1,0}的排序 过程。 (1)源程序如下所示: //文件名:exp10-1.cpp #include #define MAXE 20 //线性表中最多元素个数 typedef int KeyType; typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序 { int i,j,k; RecType temp; for (i=1;i=0 && temp.key

排序算法实验报告

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

数据结构各种排序实验报告

目录 1.引言............................................................................................................................ 错误!未定义书签。 2.需求分析 (2) 3.详细设计 (2) 3.1 直接插入排序 (2) 3.2折半排序 (2) 3.3 希尔排序 (4) 3.4简单选择排序 (4) 3.5堆排序 (4) 3.6归并排序 (5) 3.7冒泡排序 (7) 4.调试 (8) 5.调试及检验 (9) 5.1 直接插入排序 (9) 5.2折半插入排序 (9) 5.3 希尔排序 (10) 5.4简单选择排序 (10) 5.5堆排序 (11) 5.6归并排序 (12) 5.7冒泡排序 (12) 6.测试与比较................................................................................................................ 错误!未定义书签。 6.1调试步骤......................................................................................................... 错误!未定义书签。 6.2结论 (13) 7.实验心得与分析 (13) 8.附录 (15) 8.1直接插入排序 (15) 8.2折半插入排序 (16) 8.3希尔排序 (18) 8.4简单选择排序 (20) 8.5堆排序 (21) 8.6归并排序 (24) 8.7冒泡排序 (27) 8.8主程序 (28)

实验四排序实验报告

数据结构实验报告 实验名称:实验四排序 学生姓名: 班级: 班内序号: 学号: 日期:2012年12月21日 1、实验要求 题目2 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。

编写测试main()函数测试线性表的正确性。2、程序分析 2.1存储结构 说明:本程序排序序列的存储由链表来完成。 其存储结构如下图所示。 (1)单链表存储结构: (2)结点结构 struct Node {

int data; Node * next; }; 示意图: 2.2关键算法分析 一:关键算法 (一)直接插入排序void LinkSort::InsertSort() 直接插入排序是插入排序中最简单的排序方法,其基本思想是:依次将待排序序列中的每一个记录插入到一个已排好的序列中,直到全部记录都排好序。 (1)算法自然语言 1.将整个待排序的记录序列划分成有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有剩余待排序的记录; 2.将无须去的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录; 3.重复执行2,直到无序区中没有记录为止。 (2)源代码 void LinkSort::InsertSort() //从第二个元素开始,寻找前面那个比它大的

数据结构排序实验报告

《数据结构》课程设计报告 实验五排序 一、需求分析: 本演示程序用C++6.0编写,完成各种排序的实现,对输入的一组数字实现不同的排序方法,对其由小到大顺序输出。 (1)分别对直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序算法进行编写。 (2)、对存储的函数即输入的数字进行遍历。 (3)、初始化函数对输入的数字进行保存。 (4)、主函数实现使用者操作界面的编写,对输入、选择、保存、输出的各种实现。这当中还包括了各个函数的调用的实现。 (5)、程序所能达到的功能:完成对输入的数字的生成,并通过对各排序的选择实现

数字从小到大的输出。 二、程序主要功能以及基本要求: (1)、设计一个菜单,格式如下: 1、直接插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、选择排序 6、堆排序 7、退出 (2)、选择不同的菜单但进行相应的排序,并给出排序的关键字序列。 三、系统框架图: 本程序包含了9个函数,它们分别是: (1)、直接插入排序的算法函数InsertSort()。 (2)、希尔排序的算法函数ShellSort()。 (4)、快速排序的算法函数Partition()。 (5)、选择排序算法函数SelectSort()。 (6)、堆排序算法函数HeapAdjust()。 (7)、对存储数字的遍历函数Visit()。 (8)、初始化函数InitSqList()。 (9)、主函数main()。 四、详细设计 实现各个算法的主要内容,下面是各个函数的主要信息: (1)各个排序函数的算法:

一、直接插入排序 void InsertSort(SqList &L) { int i,j; for( i=2; i<=L.length;i++) { if(L.r[i].key < L.r[i-1].key) { L.r[0] = L.r[i]; L.r[i] = L.r[i-1]; for( j=i-2; (L.r[0].key < L.r[j].key); j--) L.r[j+1] = L.r[j]; L.r[j+1] = L.r[0]; } } } 二、希尔排序 void ShellSort(SqList &L) { int i, j; int dk = 1;//增量 while(dk <=L.length/3) dk = 3*dk+1;//增大增量 while(dk>0) { dk /= 3;//减小增量 for (i = dk; i <=L.length; i++) { L.r[0].key = L.r[i].key; j = i;

实验四 排序 实验报告

数据结构实验报告 实验名称:实验四排序 学生姓名: 班级: 班内序号: 学号: 日期:2012年12月21日 1、实验要求 题目2 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)。

4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。编写测试main()函数测试线性表的正确性. 2、程序分析 2.1存储结构 说明:本程序排序序列的存储由链表来完成. 其存储结构如下图所示。 (1)单链表存储结构: (2)结点结构 struct Node { ?int data;

?Node* next; }; 示意图: 2。2关键算法分析 一:关键算法 (一)直接插入排序void LinkSort::InsertSort() 直接插入排序是插入排序中最简单的排序方法,其基本思想是:依次将待排序序列中的每一个记录插入到一个已排好的序列中,直到全部记录都排好序。 (1)算法自然语言 1.将整个待排序的记录序列划分成有序区和无序区,初始时有序区为待排序记录序列中的第一个记录,无序区包括所有剩余待排序的记录; 2.将无须去的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录; 3。重复执行2,直到无序区中没有记录为止。 (2)源代码 voidLinkSort::InsertSort() ?//从第二个元素开始,寻找前面那个比它大的 { ?Node * P = front->next;?//要插入的节点的前驱 ?while(P—>next) {

c++实验报告答案

#include using namespace std; struct array { int data; }a[10]; int n; //直接插入排序 void InsertSort(array a[]) { int i,j,temp; for(i=0;i-1&&temp<=a[j].data) { a[j+1].data=a[j].data; j--; } a[j+1].data=temp; } } //直接选择排序 void SelectSort(array a[]) { int i,j,small; int temp; for(i=0;i

} } } //冒泡排序 void BubbleSort(array a[]) { bool change=true; int temp; for(int i=0;ia[j].data) { temp=a[i].data; a[i].data=a[j].data; a[j].data=temp; } } } } //递归的快速排序 int QKPass(array a[],int low,int high) { int x; x=a[low].data; while(low=x) high--; if(low

实验一算法复杂性分析实验报告——插入排序

《算法复杂性》实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术 年级: 2017级 姓名:李琳 指导教师:王淑礼职称:教授

《算法分析与设计》实验报告一 实验内容:算法复杂性 实验题目:插入排序的操作实现 学号:20175101065 姓名:佘在在 一、上机实验的问题和要求: 1、回顾数据结构中插入排序算法并编写代码; 2、对代码进行时间复杂性和空间复杂性的分析。 二、基本思想,原理和算法描述: 1、插入排序算法,若第i 个元素大于i-1 元素则直接插入;反之,需要找到适当的插入位置后再插入。插入位置的查找方式采用顺序查找方式,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间。 2、折半插入排序,在前i-1个有序的前提下,将R[i]保存到tmp中,在R[low..high]中查找插入的位置,取中间位置,选择插入点在左半区还是插入点在右半区。 3、希尔排序,第一步取d=n/2 第二步将排序序列分为d个组,在各组内进行直接插入排序 第三步递减d=d/2, 重复第二步,直到d=1 算法最后一趟对所有数据进行了直接插入排序,所以结果一定是正确的。 三、调试和运行程序过程中产生的问题及采取的措施: 过程调试时未发现错误,但是运行时意外终止,仔细检查后发现在直接插入排序插入位置没有控制下届,改正后顺利运行,得到了期望的结果。 四、源程序及注释 (1)直接插入排序 #include //自定义的输出函数 void print(int a[], int n ,int i){ printf("%d: ",i);

for(int j=0; j<8; j++) { printf("%d ",a[j]); } printf("\n"); } //直接插入排序函数 void InsertSort(int a[], int n){ for(int i= 1; i-1 && x < a[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间 a[j+1] = a[j]; j--; } a[j+1] = x; //插入到正确位置 } print(a,n,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); 原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。 稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以避免多余的比较; 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

相关文档
最新文档