数据结构实验七 排序

实验七排序

一实验任务

常用排序算法的实现。

二实验目的

1)掌握常用排序方法的思想,并用C语言实现这些排序算法。

2)了解各种常用排序算法的性能(时间复杂性、空间复杂性、算法稳定性、算法简单性等)。三实验原理

1.插入排序

插入排序有直接插入排序、折半插入排序和希尔排序等方法。

直接插入排序类似于线性表中有序表的插入:它由n-1趟排序组成,第i趟排序是向第1到i-1个有序记录之间插入一个新记录,使插入后的记录序列仍为有序。

在并向有序表中插入记录时,如果通过“折半查找”来确定插入位置,这就是折半插入排序。希尔排序使用一个序列h1, h2, …, h t,叫做增量序列(Increment Sequence)。在使用增量hk 的一趟排序之后,对于每一个记录i有P[i]≤P[i+h k],即所有相隔hk的记录都被排序。此时称该序列是hk-排序(hk-sorted)的。

2.快速交换排序

它的基本思想是,按一定的规则选择某个控制记录作为枢轴(Pivot),首先通过交换各个记录间的位置将它放置在它应该在的位置,使它之前的记录的关键字都比它的关键字小,它之后的记录的关键字都比它的关键字大。对它前后的记录各自形成的子序列,再按同样的规则处理,直到所有记录都被安置在相应的位置上。

3.选择排序

选择排序(Selection Sort)的基本思想是:在对n个记录进行的多趟排序过程中,第i趟排序是在n-i+1个记录中选择关键字最小的记录作为有序序列中的第i个记录,其中,i=1, 2, …, n-1。选择排序主要包括简单选择排序和堆排序。

简单选择排序(Simple Selection Sort)是一种简单的排序方法。它每次从待排序的记录序列中(范围从i到n)选择出关键字最小的记录,把该记录与序列中的第i个记录交换位置。堆是一个序列,其中每个记录包含一个关键字,序列中的位置k处的关键字,至少大于位置2k和2k+1处(假设这些位置存在于序列中)的关键字。

堆排序的过程分为两个步骤。首先,必须重新组合列表中的记录项,使它们满足堆的要求。第二,重复移去堆的顶层,并提升另一个记录项顶替他的位置。

4.归并排序

把两个或多个有序表合并成一个有序表的过程称为归并(Merge)。若归并的有序表有两个,叫做二路归并。

对有序表反复利用归并过程进行排序的方法称为归并排序(Merging Sort)。利用二路归并操作的排序称为二路归并排序。

二路归并排序的过程是:

(1)把无序表中的每一个元素都看作是一个有序表,则有n个有序子表;

(2)把n个有序子表按相邻位置分成若干对(若n为奇数,则最后一个子表单独作为一组),每对中的两个子表进行归并,归并后子表数减少一半;

(3)反复进行这一过程,直到归并为一个有序表为止。

四实验设备、仪器、工具与资料

微机、VC

五实验内容

根据键盘输入的数据建立一个待排序表,利用C语言设计一个主程序完成下列排序运算:

1)插入排序(直接插入排序、折半插入排序和Shell排序)

2)交换排序(快速排序)

3)选择排序(堆排序)

4)归并排序

5)结束程序运行

六实验步骤

(1)实验预习

1)预习本实验原理中的各种排序方法的思想。

2)分析掌握教材212~226页中的算法7-1~7-10,为完成实验任务做好准备。

(2)实验步骤

1)问题分析。充分地分析和理解此实验任务,弄清要求作什么,限制条件是什么。

2)系统的结构设计。按照以数据结构为中心的原则划分模块。最后写出每个子程序(过程或函数)的规格说明,列出它们之间的调用关系,可以使用调用关系图表示则更加清晰,这样便完成了系统结构设计。

3)详细设计。详细设计的目的是对子程序(过程或函数)的进一步求精。用 IF 、WHILE和赋值语句等,以及自然语言写出算法的框架。利用自然语言的目的是避免陷入细节。

4)编码。在详细设计的基础上,对详细设计的结果进一步求精,用C语言表示出来。

5)在VC环境下调试程序。

七实验报告要求

实验报告包含程序开发过程所形成的所有文档资料,包括如下内容:

1)需求分析及规格说明:问题描述,求解的问题是什么。

2)概要设计:本程序所用的数据类型定义;主程序流程;程序模块及相互关系。

3)详细设计:采用C语言定义的数据结构;各模块的伪码算法;各函数调用关系。

4)调试报告。

5)本实验任务的程序清单及运行结果。

八思考题

如何在本试验任务的实现程序中统计出各种排序算法中关键字的比较次数和纪录移动次数?

数据结构实验报告排序

实验报告 实验目的: 1. 掌握各种排序方法的排序过程; 2. 了解一些排序算法的实现。 实验内容: 学生的考试成绩表由学生的学号、姓名和成绩组成,设计一个程序对给定的n 个学生信息实现: 1.按分数高低排序,打印出每个学生在考试中的排名,分数相同的为同一名次,同一名次的学生按学号从小到大排列。 2.按照名次列出每个学生的名次、学号、姓名、成绩。 实验原理: 排序分为插入排序、交换排序、选择排序、归并排序等。插入排序又分为直接插入排序、 其他插入排序和希尔排序;交换排序分为冒泡排序和快速排序;选择排序又分为简单选择排序和堆排序。不同的排序方法各有利弊,根据具体的情况选择合适的排序方法。 设计思想: 本程序采用简单选择排序的方法。程序中定义一个stu 结构和student 类。类中定义creat 创建函数,selectgrade 成绩排序函数,samegrade、selectnum 成绩相同的按学号排序函数,print 输出函数。按照选择排序的思想,先对成绩按照从高到低进行排序;然后寻找成绩相同的部分,对该局部元素的学号从小到大进行排序。然后调用输出函数,输出名次、学号、姓名、成绩。 实现部分: 源代码: #include struct stu { int num; char name[100]; int grade; }; class student { struct stu s[100]; int length; int start,end; public: student(){length=0;} void creat(); void selectgrade(); void samegrade(); void selectnum(); void print(); };

数据结构实验报告-排序

数据结构实验报告-排序 一、实验目的 本实验旨在探究不同的排序算法在处理大数据量时的效率和性能表现,并对比它们的优缺点。 二、实验内容 本次实验共选择了三种常见的排序算法:冒泡排序、快速排序和归并排序。三个算法将在同一组随机生成的数据集上进行排序,并记录其性能指标,包括排序时间和所占用的内存空间。 三、实验步骤 1. 数据的生成 在实验开始前,首先生成一组随机数据作为排序的输入。定义一个具有大数据量的数组,并随机生成一组在指定范围内的整数,用于后续排序算法的比较。 2. 冒泡排序 冒泡排序是一种简单直观的排序算法。其基本思想是从待排序的数据序列中逐个比较相邻元素的大小,并依次交换,从而将最大(或最小)的元素冒泡到序列的末尾。重复该过程直到所有数据排序完成。 3. 快速排序

快速排序是一种分治策略的排序算法,效率较高。它将待排序的序列划分成两个子序列,其中一个子序列的所有元素都小于等于另一个子序列的所有元素。然后对两个子序列分别递归地进行快速排序。 4. 归并排序 归并排序是一种稳定的排序算法,使用分治策略将序列拆分成较小的子序列,然后递归地对子序列进行排序,最后再将子序列合并成有序的输出序列。归并排序相对于其他算法的优势在于其稳定性和对大数据量的高效处理。 四、实验结果 经过多次实验,我们得到了以下结果: 1. 冒泡排序 在数据量较小时,冒泡排序表现良好,但随着数据规模的增大,其性能明显下降。排序时间随数据量的增长呈平方级别增加。 2. 快速排序 相比冒泡排序,快速排序在大数据量下的表现更佳。它的排序时间线性增长,且具有较低的内存占用。 3. 归并排序 归并排序在各种数据规模下都有较好的表现。它的排序时间与数据量呈对数级别增长,且对内存的使用相对较高。 五、实验分析

数据结构经典七种排序方法

算法名称:选择排序 算法定义:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。算法类型:不稳定排序 算法时间复杂度:O(n2)--[n的平方] 最少移动次数:0 最多移动次数:3(n-1) 算法适用场景:这个算法时间复杂度偏高,一般不选择使用。 算法代码: void select_sort(int *x, int n) { int i, j, min, t; for (i=0; i

算法定义:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 算法类型:稳定排序 算法时间复杂度:O(n2)--[n的平方] 算法适用场景:这个算法时间复杂度偏高,一般不选择使用。 算法代码: void insert_sort(int *x, int n) { int i, j, t; for (i=1; i =0 && t <*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/ { *(x+j+1) = *(x+j); /*如果满足条件就往后挪。最坏的情况就是t 比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j+1) = t; /*找到下标为i的数的放置位置*/ } } ======================================================================= ======================================================================= 算法名称:冒泡排序 算法定义:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

数据结构实验报告-排序

实验6:排序(主要排序算法的实现) 一、实验项目名称 主要排序算法的实现 二、实验目的 深入了解各种内部排序方法及效率分析。 三、实验基本原理 1.冒泡排序:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大 的一个或最小的一个。这个数就会从序列的最右边冒出来。时间复杂度:O(n^2) 2.快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所 有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快 速排序,整个排序过程可以递归进行,使整个数据变成有序序列。时间复杂度: O(nlogn) 3.归并排序:对于一个待排序的数组,首先进行分解,将整个待排序数组以mid中 间位置为界,一分为二,随后接着分割,直至到最小单位无法分割;开始进行治 的操作,将每两个小部分进行比较排序,并逐步合并;直至合并成整个数组的大 小。从而完成了整个排序的过程。时间复杂度:O(nlogn) 4.插入排序:插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排 序序列中从后向前扫描,找到相应位置并插入。时间复杂度:O(n^2) 5.希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文 件恰被分成一组,算法便终止。时间复杂度:O(n^1.3) 6.选择排序:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存 放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然 后放到已排序的序列的末尾。. 以此类推,直到全部待排序的数据元素的个数 为零。时间复杂度O(n^2) 7.堆排序:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的 根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元 素重新构造成一个堆,这样根节点会是n个元素中的次小值,将其与n-1的元 素互换,剩下n-2个元素继续建堆。如此反复执行,便能得到一个有序序列了。 时间复杂度O(nlogn) 四、主要仪器设备及耗材 Window 11、Dev-C++5.11 五、实验步骤 1.导入库和预定义(h表示堆,q表示序列)

北理工数据结构实验 排序

本科实验报告实验名称:排序

一、实验目的 2、通过编程、上机调试,进一步理解排序的方法。 3、具体尝试插入排序、快速排序、选择排序的操作步骤。 4、锻炼动手编程,独立思考的能力。 二、实验题目 排序 输入10个数,从插入排序、快速排序、选择排序三类算法中各选一种编程实现 三、实验基础知识 插入排序、快速排序、选择排序三类算法的基本思想 四、实验设计方法 1、概要设计 (1)、插入排序(此次使用直接插入排序) void InsertionSort ( SqList &L ) { // 对顺序表L 作直接插入排序。 for ( i=2; i<=L.length; ++i ) if (L.r[i].key < L.r[i-1].key) {

L.r[0] = L.r[i]; // 复制为监视哨 for ( j=i-1; L.r[0].key < L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移 L.r[j+1] = L.r[0]; // 插入到正确位置 } } // InsertSort (2)、快速排序(此次用的是起泡排序) V oid Bubblesort(elem R[],int n) { I=n; While(i>1){ lastExchangeIndex = 1; for(j=1;j

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

《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 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的记录和枢轴记录互相交换,

数据结构实验报告排序

数据结构实验报告排序 数据结构实验报告:排序 引言: 排序是计算机科学中常见的算法问题之一,它的目标是将一组无序的数据按照特定的规则进行排列,以便于后续的查找、统计和分析。在本次实验中,我们将学习和实现几种常见的排序算法,并对它们的性能进行比较和分析。 一、冒泡排序 冒泡排序是最简单的排序算法之一,它通过不断交换相邻的元素,将较大(或较小)的元素逐渐“冒泡”到数组的一端。具体实现时,我们可以使用两层循环来比较和交换元素,直到整个数组有序。 二、插入排序 插入排序的思想是将数组分为两个部分:已排序部分和未排序部分。每次从未排序部分中取出一个元素,插入到已排序部分的适当位置,以保持已排序部分的有序性。插入排序的实现可以使用一层循环和适当的元素交换。 三、选择排序 选择排序每次从未排序部分中选择最小(或最大)的元素,与未排序部分的第一个元素进行交换。通过不断选择最小(或最大)的元素,将其放置到已排序部分的末尾,从而逐渐形成有序序列。 四、快速排序 快速排序是一种分治的排序算法,它通过选择一个基准元素,将数组划分为两个子数组,其中一个子数组的所有元素都小于等于基准元素,另一个子数组的所有元素都大于基准元素。然后对两个子数组分别递归地进行快速排序,最终

将整个数组排序。 五、归并排序 归并排序也是一种分治的排序算法,它将数组划分为多个子数组,对每个子数组进行排序,然后再将排好序的子数组合并成一个有序的数组。归并排序的实现可以使用递归或迭代的方式。 六、性能比较与分析 在本次实验中,我们对以上几种排序算法进行了实现,并通过对不同规模的随机数组进行排序,比较了它们的性能。我们使用了计算排序时间的方式,并记录了每种算法在不同规模下的运行时间。通过对比实验结果,我们可以得出以下结论: 1. 冒泡排序和插入排序在处理小规模数据时表现较好,但在处理大规模数据时性能较差,因为它们的时间复杂度为O(n^2)。 2. 选择排序的时间复杂度也为O(n^2),与冒泡排序和插入排序相似,但相对而言,选择排序的性能稍好一些。 3. 快速排序是一种高效的排序算法,它的平均时间复杂度为O(nlogn),但在最坏情况下可能达到O(n^2)。快速排序的性能受到基准元素的选择和划分策略的影响。 4. 归并排序是一种稳定的排序算法,它的时间复杂度为O(nlogn),但相对较高的空间复杂度可能成为其不足之处。 结论: 通过本次实验,我们深入学习了几种常见的排序算法,并对它们的性能进行了比较和分析。不同的排序算法适用于不同规模和类型的数据,我们可以根据实

数据结构排序的实验报告

数据结构排序的实验报告 数据结构排序的实验报告 一、引言 数据结构是计算机科学中的重要概念,它用于组织和存储数据,以便于有效地 进行操作和处理。排序算法是数据结构中的一个重要应用,它可以将无序的数 据按照一定的规则进行排列,提高数据的查找、插入和删除效率。本实验旨在 比较不同排序算法的性能表现,并分析其优缺点。 二、实验方法 本实验选取了常见的四种排序算法:冒泡排序、插入排序、选择排序和快速排序。实验使用Python语言实现,并通过随机生成的整数数组进行测试。实验环境为一台配置良好的计算机。 三、实验步骤 1. 冒泡排序:从数组的第一个元素开始,与相邻元素比较并交换位置,重复此 过程直到数组完全有序。实验记录交换次数和比较次数。 2. 插入排序:将数组分为有序和无序两部分,每次从无序部分选择一个元素插 入到有序部分的正确位置。实验记录比较次数和移动次数。 3. 选择排序:从数组中选择最小的元素,与数组的第一个元素交换位置,然后 从剩余的无序部分选择最小元素与第二个元素交换位置,以此类推。实验记录 交换次数和比较次数。 4. 快速排序:选择一个基准元素,将数组分为两部分,左边部分的元素小于等 于基准元素,右边部分的元素大于基准元素,然后分别对两部分进行递归排序。实验记录比较次数。

四、实验结果 经过多次实验,记录并统计了每种排序算法的性能表现。结果显示,快速排序在大规模数据集上表现最优,其次是插入排序,冒泡排序和选择排序性能相对较差。 五、实验分析 1. 冒泡排序的时间复杂度为O(n^2),在大规模数据集上表现较差。其交换次数和比较次数均较高,导致性能不佳。 2. 插入排序的时间复杂度为O(n^2),但在小规模数据集上表现较好。其移动次数较高,但比较次数相对较低,适用于部分有序的数据。 3. 选择排序的时间复杂度也为O(n^2),且交换次数较多。虽然比较次数相对较低,但性能仍不如快速排序。 4. 快速排序的时间复杂度为O(nlogn),在大规模数据集上表现最佳。其比较次数较高,但交换次数相对较少,适用于各种数据情况。 六、结论 根据实验结果和分析,我们可以得出以下结论: 1. 不同的排序算法适用于不同规模和特征的数据集,选择合适的排序算法可以提高排序效率。 2. 在大规模数据集上,快速排序表现最优,其时间复杂度较低。 3. 在小规模数据集上,插入排序表现较好,其时间复杂度相对较低。 七、实验总结 通过本实验,我们深入了解了不同排序算法的原理和性能表现。数据结构中的排序算法是计算机科学中的基础知识,对于编程和算法设计有着重要的影响。

(完整word版)数据结构各种排序实验报告

目录 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.调试及检验 (8) 5.1 直接插入排序 (8) 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.附录 (14) 8。1直接插入排序 (14) 8.2折半插入排序 (15) 8。3希尔排序 (17) 8。4简单选择排序 (18) 8。5堆排序 (20) 8。6归并排序 (22) 8.7冒泡排序 (25) 8.8主程序 (26)

数据结构实验七 排序

实验七排序 一实验任务 常用排序算法的实现。 二实验目的 1)掌握常用排序方法的思想,并用C语言实现这些排序算法。 2)了解各种常用排序算法的性能(时间复杂性、空间复杂性、算法稳定性、算法简单性等)。三实验原理 1.插入排序 插入排序有直接插入排序、折半插入排序和希尔排序等方法。 直接插入排序类似于线性表中有序表的插入:它由n-1趟排序组成,第i趟排序是向第1到i-1个有序记录之间插入一个新记录,使插入后的记录序列仍为有序。 在并向有序表中插入记录时,如果通过“折半查找”来确定插入位置,这就是折半插入排序。希尔排序使用一个序列h1, h2, …, h t,叫做增量序列(Increment Sequence)。在使用增量hk 的一趟排序之后,对于每一个记录i有P[i]≤P[i+h k],即所有相隔hk的记录都被排序。此时称该序列是hk-排序(hk-sorted)的。 2.快速交换排序 它的基本思想是,按一定的规则选择某个控制记录作为枢轴(Pivot),首先通过交换各个记录间的位置将它放置在它应该在的位置,使它之前的记录的关键字都比它的关键字小,它之后的记录的关键字都比它的关键字大。对它前后的记录各自形成的子序列,再按同样的规则处理,直到所有记录都被安置在相应的位置上。 3.选择排序 选择排序(Selection Sort)的基本思想是:在对n个记录进行的多趟排序过程中,第i趟排序是在n-i+1个记录中选择关键字最小的记录作为有序序列中的第i个记录,其中,i=1, 2, …, n-1。选择排序主要包括简单选择排序和堆排序。 简单选择排序(Simple Selection Sort)是一种简单的排序方法。它每次从待排序的记录序列中(范围从i到n)选择出关键字最小的记录,把该记录与序列中的第i个记录交换位置。堆是一个序列,其中每个记录包含一个关键字,序列中的位置k处的关键字,至少大于位置2k和2k+1处(假设这些位置存在于序列中)的关键字。 堆排序的过程分为两个步骤。首先,必须重新组合列表中的记录项,使它们满足堆的要求。第二,重复移去堆的顶层,并提升另一个记录项顶替他的位置。 4.归并排序 把两个或多个有序表合并成一个有序表的过程称为归并(Merge)。若归并的有序表有两个,叫做二路归并。 对有序表反复利用归并过程进行排序的方法称为归并排序(Merging Sort)。利用二路归并操作的排序称为二路归并排序。 二路归并排序的过程是: (1)把无序表中的每一个元素都看作是一个有序表,则有n个有序子表; (2)把n个有序子表按相邻位置分成若干对(若n为奇数,则最后一个子表单独作为一组),每对中的两个子表进行归并,归并后子表数减少一半; (3)反复进行这一过程,直到归并为一个有序表为止。 四实验设备、仪器、工具与资料 微机、VC 五实验内容 根据键盘输入的数据建立一个待排序表,利用C语言设计一个主程序完成下列排序运算:

数据结构实验 排序

排序实验日志 实验题目: 排序 实验目的: 掌握各种排序方法的基本思想、排序过程、算法实现,能进行时间和空间性能的分析,根据实际问题的特点和要求选择合适的排序方法。 实验要求: 实现直接排序、冒泡、直接选择、快速、堆、归并排序算法。比较各种算法的运行速度。 实验主要步骤: 1.程序代码 #include"stdio.h" #include"stdlib.h" #define Max 100 //假设文件长度 typedef struct{ //定义记录类型 int key; //关键字项 }RecType; typedef RecType SeqList[Max+1]; //SeqList为顺序表,表中第0个元素作为哨兵 int n; //顺序表实际的长度 //==========直接插入排序法====== void InsertSort(SeqList R) { //对顺序表R中的记录R[1‥n]按递增序进行插入排序 int i,j; for(i=2;i<=n;i++) //依次插入R[2],……,R[n] if(R[i].key

数据结构实验报告—排序

《算法与数据结构》课程实验报告

一、实验目的 1.实现多种类型的排序算法(插入排序、交换排序、选择排序、归并排序等) 2.理解排序过程 3.计算比较次数和移动次数,对比分析算法性能的优劣与适用场景 二、实验内容及要求 1、随机产生100个整数 2、使用不同的内排序方法对其排序,不得使用STL(标准模板库)现成代码 3、领会排序的过程 4、编程语言:C++ 三、系统分析 (1)数据方面:通过随机数产生随机整形数据,在此基础上实现相关排序功能的调试。 (2)功能方面: 1.产生随机数 2.冒泡排序 3.直接插入排序 4.折半插入排序 5.希尔排序 6.快速排序 7.直接选择排序 8.归并排序 四、系统设计 (1)设计的主要思路 利用产生随机数的方法得到待排序数据元素的有限集合。在根据不同的排序算法使得这个集合变为递增序列。其中排序算法包括冒泡排序、直接插入排序、折半插入排序、希尔排序、快速排序、直接选择排序、归并排序七中排序方式。(2)基本操作的设计 冒泡排序的基本方法:设待排序元素序列中元素个数为n,首先比较第n-2个元素和第n-1个元素,如果发生逆序(即前一个大于后一个),则将这两个元素交换;然后对第n-3个和第n-2个元素做同样处理,重复此过程直到处理完第0个和第1个元素。 直接插入排序的基本方法:当插入第i个元素时,前面的元素已经排好序,这时用V[i]的数据元素与前面的值进行比较,找到插入的位置,原来位置上的元

素向后顺移。 折半插入排序的基本方法:设在数据表中的元素序列个数为n。基本方法与直接插入排序一致,但在找寻插入位置的算法采用折半查询。 希尔排序的基本方法:设待排序序列有n个元素,首先取一个整数gap using namespace std; #include #include #include"dataList.h" int* Rand(int *A, int num, int rands); //A为储存随机数数组,num为随机数个数,rands为随机数范围

数据结构实验七 排序认识实验(含完整源代码)

实验七排序认识实验 第一部分实验目的 简要描述实验目的 通过实验过程了解并熟悉冒泡排序和快速排序算法的特点以及使用范 围和效率。 第二部分实验流程 2.1 实验工具 操作系统:Microsoft Windows10 开发软件:Visual Studio 2012 处理器:Intel(R)Core(TM)********************.59GHz 2.2 实验内容 通过实验过程了解并熟悉冒泡排序和快速排序算法的特点以及使用范围和效率。 对冒泡排序和快速排序的代码编写进行调试与修改,使得程序运行成功。第三部分实验总结 3.1 实验完成任务

(一般情况下的冒泡排序) (一般情况下的快速排序) 3.2 实验简述 调试时出现无法查找或打开 PDB 文件,通过百度,解决方法: 1、打开 vs2015,点击菜单栏中的“工具”,找到选项, 2、在选项中,展开调试,打开常规,在右边的窗口中选中“启用源服务器支持”,这时会出现一个安全警报,点击“是”即可。 在快速排序执行结果时,出现了错误: 通过检查,发现是在未初始化的情况下使用了变量 n。经过调试,初始化了n,运行成功。 3.3 实验小结 快速排序心得:

设置两个变量 i、j,排序开始的时候:i=0,j=N-1; 以第一个数组元素作为关键数据,赋值给 key,即 key=A[0]; 从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key 的值 A[j],将 A[j]和 A[i]互换; 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将 A[i]和 A[j]互换; 重复第 3、4 步,直到 i=j; (3,4 步中,没找到符合条件的值,即 3 中 A[j] 不小于 key,4 中 A[i]不大于 key 的时候改变 j、i 的值,使得 j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候 i, j 指针位置不变。另外, i==j 这一过程一定正好是 i+或 j-完成的时候,此时令循环结束)。 通过对比学习,我明白了,快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。 最后,本次实验是数据结构课的最后一次实验,经过数据结构实验课的锻炼,使我们对数据结构有了更深刻的理解,使我对其知识起到了重要的影响,增加了我编程的实践活动,为我将来的进一步学习打下了基础。 第四部分设计实验 冒泡排序是从最底层元素开始比较,(与其上的元素比较)小于就往上再比,大于就交换,再用较小的往上比较,直到最高层,第一次把最小的放到最上层,第二次把第二小的放到第二层,以次类推。当最好的情况,也就是要排序的表本身是有序的,则只需进行n-1次比较,时间复杂度为O(n)。当最坏的情况,即待排序表是逆序的情况,此时需要比较n-1次,并做等数量级的记录移动,总的时间复杂度为O(n2)。因此,其平均时间复杂度为O(n2)。 快速排序是先找到一个轴值,比较时把所有比轴值小的放到轴值的左边,比轴值大的放到右边,再在两边各自选取轴值再按前面排序,直到完成。在最好的情况下,其时间复杂度为O(nlogn),在最坏的情况下,其时间复杂度为O(n2)。因此,其平均时间复杂度为O(nlogn)。 所以,总的来说,快速排序的效率要好于冒泡,尤其在n非常大时。

数据结构实验8-7

实验7 排序 实验人:学号:时间: 一、实验目的 1.熟悉掌握教材中所介绍的几种排序方法。 2.学会分析各种内排序算法的性能。 二、实验内容 1.随机产生20位整数 2.输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。 (1)冒泡排序 (2)快速排序 3.纪录每种方法比较次数和移动次数 三、实验步骤 1、冒泡排序 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较。如此下去,直至最终完成排序。 2、快速排序 (1)基本思想 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基 本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都 比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整 个排序过程可以递归进行,以此达到整个数据变成有序序列。 (2)实现方法 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一 趟快速排序。一趟快速排序的算法是: 1)设置两个变量I、J,排序开始的时候:I=1,J=N-1; 2)以第一个数组元素作为关键数据,赋值给X,即X=A[0]; 3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换; 4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换; 5)重复第3、4步,直到I=J; 四、算法说明 五、测试结果 六、分析与探讨 七、附录:源代码 源代码列在附录中,要求程序风格清晰易理解,有充分的注释。有意义的注释行不 少于30%。

数据结构排序方法总结

数据结构排序方法总结 数据结构排序方法总结 1.冒泡排序 冒泡排序是一种基本的排序算法,它重复地交换相邻元素的位置,直到整个数组有序。具体步骤如下:________ ●从第一个元素开始,依次比较相邻元素的大小,若前者大于后者,则交换它们的位置。 ●重复上述比较和交换步骤,直到没有任何一对元素需要交换为止。 2.插入排序 插入排序是一种简单直观的排序算法,它将一个未排序的元素逐个插入到已排序的序列中。具体步骤如下:________ ●从第二个元素开始,将其与已排序的元素从右向左逐个比较,若大于待插入元素,则将已排序元素右移一位。 ●将待插入元素插入到找到的位置处。 ●重复上述比较和插入步骤,直到所有元素都已排序。 3.选择排序

选择排序是一种简单直观的排序算法,它每次选择未排序序 列中的最小元素,并将其与未排序序列的第一个元素交换位置。具 体步骤如下:________ ●在未排序序列中找到最小的元素,将其与未排序序列的第 一个元素交换位置。 ●在剩余的未排序序列中找到最小的元素,将其与未排序序 列的第一个元素交换位置。 ●重复上述比较和交换步骤,直到所有元素都已排序。 4.快速排序 快速排序是一种高效的排序算法,它采用分治的思想,将一 个数组分成两个子数组,然后递归地对子数组进行排序。具体步骤 如下:________ ●选择一个基准元素,将数组分成左右两个子数组,使得左 子数组的所有元素小于等于基准元素,右子数组的所有元素大于等 于基准元素。 ●递归地对左子数组和右子数组进行排序。 ●合并左子数组、基准元素和右子数组,得到排序后的数组。 5.归并排序

归并排序是一种稳定的排序算法,它采用分治的思想,将一 个数组分成两个子数组,然后递归地对子数组进行排序,并将排序 后的子数组合并成一个有序数组。具体步骤如下:________ ●分解:________将数组不断地对半分成两个子数组,直到 子数组的长度为1。 ●合并:________将两个已排序的子数组合并成一个有序的 数组。 ●重复上述分解和合并步骤,直到得到整个数组的有序序列。 6.堆排序 堆排序是一种高效的排序算法,它利用堆这种数据结构进行 排序。具体步骤如下:________ ●构建大顶堆:________从最后一个非叶子节点开始,将数 组调整为一个大顶堆。 ●交换堆顶元素和最后一个元素,然后调整堆,使其满足大 顶堆的性质。 ●重复上述交换和调整步骤,直到整个数组有序。 7.计数排序 计数排序是一种非比较的排序算法,它统计每个元素出现的 次数,并根据元素的大小进行排序。具体步骤如下:________

相关主题
相关文档
最新文档