排序算法学习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排序算法学习报告
一、学习内容
所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待
排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。
要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。
常见的排序算法
2.1插入排序
插入排序是这样实现的:
首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
【示例】:
[初始关键字][49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
2.2冒泡排序冒泡排序是这样实现的:首先将所有待排序的数字放入工作列表中。
从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
重复2号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法
【示例】:
49 13 13 13 13 13 13 13
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
2.3选择排序
选择排序是这样实现的:
设数组内存放了n个待排数字,数组下标从1开始,到n结束。i=1 从数组的第i个元素开始到第n 个元素,寻找最小的元素将上一步找到的最小元素和第i位元素交换。
如果i=n —1算法结束,否则回到第3步
【示例】:
初始关键字[49 38 65 97 76 13 27 49]
第一趟排序后13 [ 38 65 97 76 49 27 49]
第二趟排序后13 27 [ 65 97 76 49 38 49]
第三趟排序后13 27 38 [97 76 49 65 49]
第四趟排序后13 27 38 49 [49 97 65 76]
第五趟排序后13 27 38 49 49 [97 97 76]
第六趟排序后13 27 38 49 49 76 [76 97]
第七趟排序后13 27 38 49 49 76 76 [ 97]
最后排序结果13 27 38 49 49 76 76 97
2.4快速排序
基本思想:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..l-1]和R[I+1..H],且左边的无序子
区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于
最终排序的位置上,即R[1..l-1] 【示例】: 初始关键字[49 38 65 97 76 13 27 49 ] 第一次交换后[27 38 65 97 76 13 49 49 ] 第二次交换后[27 38 49 97 76 13 65 49 ] J向左扫描,位置不变,第三次交换后[27 38 13 97 76 49 65 49 ] I向右扫描,位置不变,第四次交换后[27 38 13 49 76 97 65 49 ] J 向左扫描 [27 38 13 49 76 97 65 49 ] (一次划分过程) 初始关键字 [49 38 65 97 76 13 27 49 ] 一趟排序之后[27 38 13 ] 49 [ 76 97 65 49 ] 二趟排序之后[13 ] 27 [ 38 ] 49 [ 49 65] 76 [ 97 ] 三趟排序之后13 27 38 49 49 [ 65 ] 76 97 最后的排序结果13 27 38 49 49 65 76 97 2.5堆排序 基本思想: 堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储 结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性: Ki < K2i Ki < K2i+1(1 < I < [N/2]) 堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中 任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。 排序过程: 堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区