- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法排序问题实验报告
《排序问题求解》实验报告
算法的基本思想
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 j0 and A[j]key
do A[j+1]←A[j]
j←j-1
A[j+1]←key
快速排序算法思想
快速排序算法的基本思想是,通过一趟排序将待排序序列分割成独立的两部分,其中一
部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达
到整个序列有序。
假设待排序序列为数组 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 lowhigh //从表的两端交替地向中间扫描
while lowhigh A[high]=privotkey do high←high-1
A[low]←A[high] //将比枢轴记录小的记录移到低端
while lowhigh A[low]=pivotkey) do low←low+1
A[high]←A[low] //将比枢轴记录大的记录移到高端
A[low]←A[0] //枢轴记录到位
return low //返回枢轴位置
算法的理论分析
1. 直接插入排序算法理论分析
从空间来看,直接插入排序只需要一个数的辅助空间;从时间来看,直接插入排序的基
本操作为:比较两个关键字的大小和移动记录。先分析一趟直接插入排序的情况。伪代码
InsertionSort 中 while 循环的次数取决于待插入的数与前 i-1 个数之间的关系。若 A[i]A[0],则在 while 循环中,待插入数需与有序数组 A[1..i-1]中 i-1 个数进行比较,并将 A[i-1]中 i-1 个数后移。则在整个排序过程(进行 n-1 趟插入排序)中,当待排序数组中数按非递减有序排列时,则需进行数间比较次数达最小值 n-1,数不需要移动;反之,当待排序数组中数按非递增有序排列时,总的比较次数达最大值(n+2)(n-1)/2,数移动的次数也达到最大值(n+4)(n-1)/2。
若待排序数组是随机的,即待排序数组中的数可能出现的各种排序的概率相同,则我们可取
上述最小值和最大值的平均值,作为直接插入排序时所需进行数间的比较次数和数的移动次
数,约为 n^2/4。
因此直接插入排序算法,在最佳情况下的时间复杂度是 O(n),在最坏情况下的时间复杂度为 O(n^2)。
2. 快速排序算法理论分析
下面我们来分析快速排序的平均时间性能。
假设 T(n)为对 n 个记录 A[1..n]进行快速排序所需时间,则由算法 QuickSort 可见:
其中,Tpass(n)为对 n 个记录进行一趟快速排序 Partition(A,1,n)所需的时间,从一
趟快速排序算法可见,其和记录数 n 成正比,可以用 cn 表示(c 为某个常数);T(k-1)和 T
(n-k)分别为对 A[1..k-1]和 A[k+1..n]中记录进行快速排序 QuickSort(A,1,k-1)和
QuickSort(A,k+1,n)所需时间。假设待排序列中记录是随机排列的,
原创力文档


文档评论(0)