数据结构各种排序算法的时间性能
数据结构与算法分析实验报告

数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
如何选择合适的数据结构和算法

选择合适数据结构和算法选择合适的数据结构和算法是优化软件性能的重要步骤,以下是一些建议:1.明确需求:首先,需要明确你的软件需求,包括数据处理速度、存储空间、可扩展性、稳定性等方面的要求。
2.了解数据特点:根据数据的性质和特点选择合适的数据结构。
例如,对于大量数值型数据,可以使用数组或列表;对于有序数据,可以使用二叉搜索树或平衡二叉树等。
3.了解算法特点:同样,需要了解各种算法的特点和适用场景。
例如,对于排序问题,快速排序、归并排序和冒泡排序等算法各有优缺点,需要根据实际情况选择。
4.考虑时间复杂度与空间复杂度:在选择算法时,需要考虑其时间复杂度和空间复杂度。
对于大规模数据或实时性要求较高的场景,需要选择时间复杂度较低的算法。
同时,也需要考虑算法所需的额外空间开销。
5.实际测试:在选择数据结构和算法时,需要进行实际测试和比较。
通过实验,可以了解不同数据结构和算法在实际场景中的表现,从而作出更合理的选择。
6.了解现有工具和库:现代编程语言和开发框架通常提供了许多现成的工具和库,如数据库、缓存系统、搜索算法等。
了解并合理利用这些工具和库,可以更快地实现功能并提高性能。
7.团队技能与经验:还需要考虑团队成员的技能和经验。
如果团队对某种数据结构和算法有丰富的实践经验,那么选择该方案可以降低开发难度和提高开发效率。
8.持续优化:软件需求和技术环境不断变化,因此需要持续关注性能表现并进行优化。
通过监控和分析工具,可以及时发现性能瓶颈并进行针对性的改进。
总之,选择合适的数据结构和算法需要考虑多个方面,包括需求、数据特点、算法特点、时间复杂度、空间复杂度、工具和库、团队技能以及持续优化等。
在实际开发中,可能需要根据实际情况进行综合评估和权衡,以作出最合理的选择。
数据结构课程设计—内部排序算法比较

数据结构课程设计—内部排序算法比较在计算机科学领域中,数据的排序是一项非常基础且重要的操作。
内部排序算法作为其中的关键部分,对于提高程序的运行效率和数据处理能力起着至关重要的作用。
本次课程设计将对几种常见的内部排序算法进行比较和分析,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。
冒泡排序是一种简单直观的排序算法。
它通过重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
这种算法的优点是易于理解和实现,但其效率较低,在处理大规模数据时性能不佳。
因为它在最坏情况下的时间复杂度为 O(n²),平均时间复杂度也为O(n²)。
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个序列有序。
插入排序在数据量较小时表现较好,其平均时间复杂度和最坏情况时间复杂度也都是 O(n²),但在某些情况下,它的性能可能会优于冒泡排序。
选择排序则是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。
以此类推,直到全部待排序的数据元素排完。
选择排序的时间复杂度同样为O(n²),但它在某些情况下的交换操作次数可能会少于冒泡排序和插入排序。
快速排序是一种分治的排序算法。
它首先选择一个基准元素,将数列分成两部分,一部分的元素都比基准小,另一部分的元素都比基准大,然后对这两部分分别进行快速排序。
快速排序在平均情况下的时间复杂度为 O(nlogn),最坏情况下的时间复杂度为 O(n²)。
然而,在实际应用中,快速排序通常表现出色,是一种非常高效的排序算法。
归并排序也是一种分治算法,它将待排序序列分成若干个子序列,每个子序列有序,然后将子序列合并成一个有序序列。
《数据结构821》考试大纲

《数据结构(821)》考试大纲一、考试要求:本课程要求掌握数据结构的基本理论知识,常用数据结构及对应的基本算法,以及数据结构的程序实现技能。
内容包括线性表、栈、队列、树、图等常见结构的逻辑结构、存储结构和对应的常用基本算法,以及查找和排序的基本概念和常用算法。
会做简单的算法分析,包括算法的时间代价和空间代价。
会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法。
课程考试中既测试对基本知识、基本理论的掌握程度,又测试对基本知识与基本理论的灵活运用能力。
二、考试内容:1.绪论(1)数据结构基本概念和术语;(2)算法描述的方法;(3)逻辑结构、存储结构及数据运算三方面的要领及相互关系;(4)算法复杂度的分析方法。
2.线性表(1)线性表的逻辑特性;(2)两类不同的存储结构(顺序和链式存储结构)的异同;(3)单链表、循环链表、双向链表的特点;(4)线性表在顺序存储结构中实现基本运算(查找、插入、删除、合并等)的算法及分析;(5)线性表在链式存储结构中实现基本运算(查找、插入、删除、合并等)的算法及分析;(6)用时间和空间复杂度分析线性表的特点。
3.栈和队列(1)栈和队列的基本概念;(2)栈和队列在存储结构上的基本运算的实现;(3)循环队列中对边界条件的处理;(4)栈的典型应用并能编程实现。
4.串(1)串的逻辑结构定义;(2)串的基本运算及其实现;(3)串的堆分配存储结构;(4)串的模式匹配算法。
5.数组和广义表(1)数组的逻辑结构和存储结构;(2)数组在以行为主的存储结构中地址的计算方法;(3)特殊矩阵的压缩存储方式及下标变换公式;(4)稀疏矩阵压缩存储方法的特点和适用范围,三元组表示的稀疏矩阵进行矩阵运算时采用的处理方法。
6.树和二叉树(1)树的定义和基本术语;(2)二叉树的定义;(3)二叉树的结构特性及相应的证明方法;(4)二叉树的各种存储结构特点及使用范围;(5)二叉树的各种遍历算法;(6)线索二叉树的定义;(7)树的存储结构;(8)树和二叉树的转换方法;(9)最优二叉树的特性;(10)建立最优二叉树和实现Huffman编码的方法。
数据结构实验报告-排序

数据结构实验报告-排序一、实验目的本实验旨在探究不同的排序算法在处理大数据量时的效率和性能表现,并对比它们的优缺点。
二、实验内容本次实验共选择了三种常见的排序算法:冒泡排序、快速排序和归并排序。
三个算法将在同一组随机生成的数据集上进行排序,并记录其性能指标,包括排序时间和所占用的内存空间。
三、实验步骤1. 数据的生成在实验开始前,首先生成一组随机数据作为排序的输入。
定义一个具有大数据量的数组,并随机生成一组在指定范围内的整数,用于后续排序算法的比较。
2. 冒泡排序冒泡排序是一种简单直观的排序算法。
其基本思想是从待排序的数据序列中逐个比较相邻元素的大小,并依次交换,从而将最大(或最小)的元素冒泡到序列的末尾。
重复该过程直到所有数据排序完成。
3. 快速排序快速排序是一种分治策略的排序算法,效率较高。
它将待排序的序列划分成两个子序列,其中一个子序列的所有元素都小于等于另一个子序列的所有元素。
然后对两个子序列分别递归地进行快速排序。
4. 归并排序归并排序是一种稳定的排序算法,使用分治策略将序列拆分成较小的子序列,然后递归地对子序列进行排序,最后再将子序列合并成有序的输出序列。
归并排序相对于其他算法的优势在于其稳定性和对大数据量的高效处理。
四、实验结果经过多次实验,我们得到了以下结果:1. 冒泡排序在数据量较小时,冒泡排序表现良好,但随着数据规模的增大,其性能明显下降。
排序时间随数据量的增长呈平方级别增加。
2. 快速排序相比冒泡排序,快速排序在大数据量下的表现更佳。
它的排序时间线性增长,且具有较低的内存占用。
3. 归并排序归并排序在各种数据规模下都有较好的表现。
它的排序时间与数据量呈对数级别增长,且对内存的使用相对较高。
五、实验分析根据实验结果,我们可以得出以下结论:1. 冒泡排序适用于数据较小的排序任务,但面对大数据量时表现较差,不推荐用于处理大规模数据。
2. 快速排序是一种高效的排序算法,适用于各种数据规模。
排序有哪几种方法

排序有哪几种方法排序是计算机科学中非常重要的概念之一,它指的是将一组元素按照某种规则进行重新排列的过程。
排序算法可以分为多种类型,包括插入排序、交换排序、选择排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。
下面我将详细介绍每种排序方法的原理、特点和应用场景。
1. 插入排序(Insertion Sort)插入排序是一种简单且直观的排序算法。
它的原理是将一个未排序的元素逐个地插入到已排序的部分中,最终形成一个完全有序的序列。
具体操作是从第二个元素开始,将其与前面已排序的元素逐个比较并插入到正确的位置。
插入排序的时间复杂度为O(n^2),适用于小规模或部分有序的序列。
2. 交换排序(Exchange Sort)交换排序包括冒泡排序和快速排序。
冒泡排序(Bubble Sort)的原理是从头到尾依次比较相邻的两个元素,如果顺序不对则交换位置,一轮下来可以将最大的元素移动到末尾。
快速排序(Quick Sort)使用了分治的思想,通过选择一个基准元素将序列分成左右两部分,左边的元素都小于该基准值,右边的元素都大于该基准值,然后递归地对左右两部分进行快速排序。
交换排序的平均时间复杂度为O(nlogn),适合用于排序大规模随机数据。
3. 选择排序(Selection Sort)选择排序的原理很简单:每一次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾。
具体操作是通过不断找到最小元素的索引,然后将其与第一个未排序元素交换,如此循环直到所有元素都被排序。
选择排序的时间复杂度为O(n^2),适用于简单的排序需求。
4. 归并排序(Merge Sort)归并排序采用了分治的思想,将一个序列递归地分成两个子序列,直到每个子序列只有一个元素,然后将两个有序的子序列合并成一个有序的序列。
具体操作是比较两个子序列的第一个元素,将较小的元素放入结果序列,然后再比较较小元素所在子序列的下一个元素与另一个子序列的第一个元素,直到所有元素都被放入结果序列。
数据结构必考知识点总结

数据结构必考知识点总结在准备考试时,了解数据结构的基本概念和相关算法是非常重要的。
以下是一些数据结构的必考知识点总结:1. 基本概念数据结构的基本概念是非常重要的,包括数据、数据元素、数据项、数据对象、数据类型、抽象数据类型等的概念。
了解这些概念有助于更好地理解数据结构的本质和作用。
2. 线性表线性表是数据结构中最基本的一种,它包括顺序表和链表两种实现方式。
顺序表是将数据元素存放在一块连续的存储空间内,而链表是将数据元素存放在若干个节点中,每个节点包含数据和指向下一个节点的指针。
了解线性表的概念和基本操作是非常重要的。
3. 栈和队列栈和队列是两种特殊的线性表,它们分别具有后进先出和先进先出的特性。
栈和队列的实现方式有多种,包括数组和链表。
掌握栈和队列的基本操作和应用是数据结构的基本内容之一。
4. 树结构树是一种非线性的数据结构,它包括二叉树、多路树、二叉搜索树等多种形式。
了解树的基本定义和遍历算法是必考的知识点。
5. 图结构图是一种非线性的数据结构,它包括有向图和无向图两种形式。
了解图的基本概念和相关算法是非常重要的,包括图的存储方式、遍历算法、最短路径算法等。
6. 排序算法排序是一个非常重要的算法问题,掌握各种排序算法的原理和实现方式是必不可少的。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
7. 查找算法查找是另一个重要的算法问题,包括顺序查找、二分查找、哈希查找、树查找等。
了解各种查找算法的原理和实现方式是必考的知识点之一。
8. 算法复杂度分析算法的时间复杂度和空间复杂度是评价算法性能的重要指标,掌握复杂度分析的方法和技巧是非常重要的。
9. 抽象数据类型ADT是数据结构的一种概念模型,它包括数据的定义和基本操作的描述。
了解ADT的概念和实现方式是非常重要的。
10. 动态存储管理动态存储管理是数据结构中一个重要的问题,包括内存分配、内存释放、内存回收等。
了解动态存储管理的基本原理和实现方式是必考的知识点之一。
(完整版)数据结构与算法第8章答案

第8 章排序技术课后习题讲解1. 填空题⑴排序的主要目的是为了以后对已排序的数据元素进行()。
【解答】查找【分析】对已排序的记录序列进行查找通常能提高查找效率。
⑵对n个元素进行起泡排序,在()情况下比较的次数最少,其比较次数为()。
在()情况下比较次数最多,其比较次数为()。
【解答】正序,n-1,反序,n(n-1)/2⑶对一组记录(54, 38, 96, 23, 15, 72, 60, 45, 83)进行直接插入排序,当把第7个记录60插入到有序表时,为寻找插入位置需比较()次。
【解答】3【分析】当把第7个记录60插入到有序表时,该有序表中有2个记录大于60。
⑷对一组记录(54, 38, 96, 23, 15, 72, 60, 45, 83)进行快速排序,在递归调用中使用的栈所能达到的最大深度为()。
【解答】3⑸对n个待排序记录序列进行快速排序,所需要的最好时间是(),最坏时间是()。
【解答】O(nlog2n),O(n2)⑹利用简单选择排序对n个记录进行排序,最坏情况下,记录交换的次数为()。
【解答】n-1⑺如果要将序列(50,16,23,68,94,70,73)建成堆,只需把16与()交换。
【解答】50⑻对于键值序列(12,13,11,18,60,15,7,18,25,100),用筛选法建堆,必须从键值为()的结点开始。
【解答】60【分析】60是该键值序列对应的完全二叉树中最后一个分支结点。
2. 选择题⑴下述排序方法中,比较次数与待排序记录的初始状态无关的是()。
A插入排序和快速排序B归并排序和快速排序C选择排序和归并排序D插入排序和归并排序【解答】C【分析】选择排序在最好、最坏、平均情况下的时间性能均为O(n2),归并排序在最好、最坏、平均情况下的时间性能均为O(nlog2n)。
⑵下列序列中,()是执行第一趟快速排序的结果。
A [da,ax,eb,de,bb] ff [ha,gc]B [cd,eb,ax,da] ff [ha,gc,bb]C [gc,ax,eb,cd,bb] ff [da,ha]D [ax,bb,cd,da] ff [eb,gc,ha]【解答】A【分析】此题需要按字典序比较,前半区间中的所有元素都应小于ff,后半区间中的所有元素都应大于ff。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY 课程实习报告题目:排序算法的时间性能学生姓名学生学号专业班级指导老师李晓鸿完成日期设计一组实验来比较下列排序算法的时间性能快速排序、堆排序、希尔排序、冒泡排序、归并排序(其他排序也可以作为比较的对象)要求(1)时间性能包括平均时间性能、最好情况下的时间性能、最差情况下的时间性能等。
(2)实验数据应具有说服力,包括:数据要有一定的规模(如元素个数从100到10000);数据的初始特性类型要多,因而需要具有随机性;实验数据的组数要多,即同一规模的数组要多选几种不同类型的数据来实验。
实验结果要能以清晰的形式给出,如图、表等。
(3)算法所用时间必须是机器时间,也可以包括比较和交换元素的次数。
(4)实验分析及其结果要能以清晰的方式来描述,如数学公式或图表等。
(5)要给出实验的方案及其分析。
说明本题重点在以下几个方面:理解和掌握以实验方式比较算法性能的方法;掌握测试实验方案的设计;理解并实现测试数据的产生方法;掌握实验数据的分析和结论提炼;实验结果汇报等。
一、需求分析(1) 输入的形式和输入值的范围:本程序要求实现各种算法的时间性能的比较,由于需要比较的数目较大,不能手动输入,于是采用系统生成随机数。
用户输入随机数的个数n,然后调用随机事件函数产生n个随机数,对这些随机数进行排序。
于是数据为整数(2) 输出的形式:输出在各种数目的随机数下,各种排序算法所用的时间和比较次数。
(3) 程序所能达到的功能:该程序可以根据用户的输入而产生相应的随机数,然后对随机数进行各种排序,根据排序进行时间和次数的比较。
(4)测试数据:略二、概要设计1.抽象数据类型ADT List数据对象D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 }数据关系R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }基本操作virtual void clear() = 0;bool insert(const Elem&) = 0;bool append(const Elem&) = 0;lbool remove(Elem&) = 0;void setStart() = 0;void setEnd() = 0;void prev() = 0;void next() = 0;int leftLength() const = 0;int rightLength() const = 0;bool setPos(int pos) = 0;bool getValue(Elem&) const = 0;void print() const = 0;2.程序的流程(1)输入模块:输入要排序的数的数量n(2)处理模块:系统产生n个随机数,对随机数进行排序(3)输出模块:将排序的结果输出3.算法的基本思想1、随机数的产生:利用srand()产生随机数。
2、快速排序:选定一记录R,将所有其他记录关键字k’与记录R的关键字k比较, 若k’<k则将记录换至R之前,若k’ >k 则将记录换至R之后,继续对R前后两部分记录进行快速排序,直至排序范围为13、插入排序:逐个处理待排序的记录,每个新记录与前面已排序的子序列进行比较,将它插入到子序列中正确的位置4、冒泡排序:比较并交换相邻的元素对,直到所有元素都被放到正确的地方为止。
5、归并排序:将两个或者多个有序表归并成一个有序表6、堆排序:首先将数组转化为一个满足堆定义的序列,然后将堆顶的最大元素取出,再将剩下的数排成堆,再取堆顶数值,…。
如此下去,直到堆为空。
到最后结束时,就排出了一个由小到大排列的数组。
三、详细设计(1)产生随机数:直接调用函数srand(),以时间作为随机种子进行选择,并把随机数装入数组中unsigned long int *Sort::setRan(unsigned long int num){unsigned long int *ra;ra=(unsigned long int*)malloc(num*sizeof(unsigned long int));srand(time(NULL));for(unsigned long int m=0;m<num;m++){ra[m]=rand();}cout<<endl;return ra;}(2)快速排序:要实现快速排序首先选择一个轴值,这里选取数组第一个为轴值。
定义两个标识low,high。
high标识最后一个元素的位置,从后向前,将关键字与轴值比较,直至遇到小于轴值的关键字,前移,low标识在第二个元素的位置,从前向后,将关键字与轴值比较,直至遇到大于轴值的关键字,后移。
当low,high相遇后第一趟排序结束。
调整数列,轴值左边的为比轴值小的,右边为比轴值大的。
对轴值左边(即low到pivotkey-1的数)和右边的子列(pivotkey+1到high的数)分别进行上述递归快速排序,直到范围为1结束。
int partition(int a[],int low,int high){//快速排序中的一趟int pivotkey; //作为枢轴来使用pivotkey=a[low];while(low<high){while(low<high&&a[high]>=pivotkey)--high;a[low]=a[high];while(low<high&&a[low]<=pivotkey)++low;a[high]=a[low];}a[low]=pivotkey;return low;}void qsort(int a[],int low,int high){//快速排序的递归形式int pivotloc;if(low<high){pivotloc=partition(a,low,high);//一趟排序结果的调用qsort(a,low,pivotloc-1);qsort(a,pivotloc+1,high);}}(3)插入排序:插入排序的思想是将一组无序的元素分别插入一个已经有序的的数组里,并保证插入后的数组也是有序的。
当所有无序组的元素都插入完毕时,一个有序数组构造完成。
数组n[1…r]为初始的一个无序数组(为了直观起见,我们这里设定数组从1开始,而不是0),则n[1]默认为只有一个元素的有序数组,n[2]插入只有n[1]构成的有序数组中,则此时有序数组的元素数量变为2。
以此类推,到第i个元素时,前i-1个元素已经是有序的,此时只需将第i个元素插入到有序数组中并使之保持有序。
如此直至最后一个元素插入完毕,整个插入排序完成。
void Sort::insertSort(unsigned long int *s){this->setNum();LARGE_INTEGER Freg;LARGE_INTEGER Count1,Count2;QueryPerformanceFrequency(&Freg);QueryPerformanceCounter(&Count1);//获取时间Count1double d;int temp,j;for (unsigned long int i=0;i<this->getRanNum();i++){j=i;temp=s[i];while (j>=1 && temp<s[j-1]){s[j]=s[j-1];j--;this->SortNum++;}if(j>1)this->SortNum++;s[j]=temp;}QueryPerformanceCounter(&Count2);//获取时间Count2d=(double)(Count2.QuadPart-Count1.QuadPart)/(double)Freg.QuadPart*1000.0;//计算时间差,d的单位为ms.cout<<"插入排序算法对"<<this->RanNum<<"个随机数排序时间为为"<<d<<" ms."<<endl;cout<<"插入排序算法对"<<this->RanNum<<"个随机数交换次数为"<<this->SortNum<<"次。
"<<endl;}(4) 冒泡排序(bubble sort):将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。
根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。
如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。
即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。
扫描R[2..n]。
扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……最后,经过n-1 趟扫描可得到有序区R[1..n]void Sort::bubbleSort(unsigned long int *s){this->setNum();LARGE_INTEGER Freg;LARGE_INTEGER Count1,Count2;QueryPerformanceFrequency(&Freg);QueryPerformanceCounter(&Count1);//获取时间Count1double d;unsigned long int temp;for(unsigned long int i=0;i<(this->RanNum);i++){for(int j=i+1;j<(this->RanNum);j++){if(s[i]>s[j]){temp = s[i];s[i]=s[j];s[j]=temp;this->SortNum++;}}}QueryPerformanceCounter(&Count2);//获取时间Count2d=(double)(Count2.QuadPart-Count1.QuadPart)/(double)Freg.QuadPart*1000.0;//计算时间差,d的单位为ms.cout<<"冒泡排序算法对"<<this->RanNum<<"个随机数排序时间为"<<d<<" ms."<<endl;cout<<"冒泡排序算法对"<<this->RanNum<<"个随机数交换次数为"<<this->SortNum<<"次。