算法分析作业1_简单排序算法分析讲述

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

排序算法复杂性分析一

秦健刘鹏刘明欢

我们郑重承诺,本作业的内容均为原创,没有任何抄袭他人成果的行为,也不存在他人代写作业和程序的行为。引用他人成果或公开资料的部分都已经按照正确的格式在参考文献中标出。

作者签字

得分统计

摘要

本文通过三种简单排序-插入、冒泡和选择排序算法并运用C++语言编程实现,以计算简单排序算法复杂度。首先,利用不同规模下随机产生的不同序列,计算三种排序方法下的元运算-比较、交换、移动的次数来定量刻画排序算法的时间复杂度,即序列规模与元运算次数的关系,得到三种算法的时间复杂度均为Ο(n2),这说明这三种排序算法具有相同时间复杂度,并且实现简单,所以也归为一类简单排序算法。其次,采用统一规模下的不同排列顺序,主要是两个极端序-顺序、逆序的情况下分析三种算法的时间复杂度,得到算法的最好时间复杂度为Ο(1),最坏时间复杂度为Ο(n2),反映出不同顺序的序列导致的排序算法时间复杂度的巨大差异性,并且插入、冒泡排序与选择排序之间的优劣也逐渐显现出来,主要是由于逆序对的数目导致交换次数变化的缘故。最后,本文将作为其他排序算法的时间复杂度作为后续扩展部分,以待完善。本文将围绕以下两个问题进行讨论分析:

1)设计一个程序,程序的输入为n个(n必须要从键盘输入)0到10000的正整数(正整数可以是随机产生),输出为对这n个数进行从小到大排序后的序列。排序方法分别使用插入排序、冒泡排序和选择排序。

2)以两个数比较、两个数交换、移动一个数为基本计算单位,测试你所编写的程序对于n=100,500,1000,2000四种输入规模的时间复杂度。

一、算法复杂度

1.1算法复杂性

算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。

计算机的资源,最重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性之分。

1.2时间复杂度【1】

如果分别用N ,I 和A 表示算法要解的问题的规模、算法的输入和算法本身,而且用C 表示复杂性,把时间复杂性和空间复杂性分别用T 和S 来表示那么有 C =F (N,I,A )

T =T (N,I,A ) -------(1)

S =S (N,I,A ) 设计算机所提供的元运算有k 种,分别记为Ο1,Ο2,…,Οk 。又设每执行一次这些元运算所需要的时间分别为t 1,t 2,…,t k 。经统计用到的元运算Οi 的次数为e i ,i =1,2,…,k ,则有e i =e i (N,I )。因此,T (N,I )=∑t i k i=1e i (N,I )。记最坏情况、最好情况和平均情况下的时间复杂性,并分别有

T max (N )=max I∈D N T (N,I )=max I∈D N ∑t i k i=1e i (N,I )=T (N,I ∗

)

T min (N )=min I∈D N T (N,I )=min I∈D N ∑t i k

i=1

e i (N,I )=T (N,I ~)

T avg (N )=∑P(I)k i=1T (N,I )=∑P(I)∑t i k i=1e i (N,I )k i=1

其中,D N 是规模为N 的合法输入的集合;I ∗, I ~分别是D N 中使T (N,I ∗)达到T max (N )的合法输入与使T (N,I ~)达到T min (N )的合法输入;而P(I)是在算法的应用中出现输入I 的概率。

二、简单排序算法

2.1简单排序法思想【2】

2.1.1插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

2.1.2冒泡排序

重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序是这样实现的:首先从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。然后重复1号步骤,直至再也不能交换。

2.1.3选择排序

选择排序工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:初始状态:无序区为R[1..n],有序区为空。第1趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

2.2简单排序法流程图

此处仅给出选择排序算法流程图,冒泡、插入排序算法流程图可根据2.1

算法步骤类似给出。

2.3简单排序法伪代码

同理,此处仅给出插入排序算法伪代码,冒泡、选择排序算法伪代码可根据附录③中的程序类似给出。

INSERTION-SORT(A)

Begin

1 forj=0 to length[A]-1

2 if A[j]>A[j+1] then key=A[j]

3 //InsertA[j+1] into the sorted sequence A[0..j].

4 i=j+1

5 while i>0 and A[i]

6 A[i+1]->key

7 A[i] ->A[i+1]

8 i=i-1

9 print A[i]

End

相关文档
最新文档