算法排序问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《排序问题求解》实验报告
一、算法得基本思想
1、直接插入排序算法思想
直接插入排序得基本思想就是将一个记录插入到已排好序得序列中,从而得到一个新得,
记录数增 1 得有序序列。
直接插入排序算法得伪代码称为InsertionSort,它得参数就是一个数组A[1、、n],包含了n
个待排序得数。用伪代码表示直接插入排序算法如下:
InsertionSort (A)
for i←2 ton
do key←A[i]//key 表示待插入数
//Insert A[i] into thesortedsequence A[1、、i-1]
j←i-1
while j>0 andA[j]>key
do A[j+1]←A[j]
j←j-1
A[j+1]←key
2、快速排序算法思想
快速排序算法得基本思想就是,通过一趟排序将待排序序列分割成独立得两部分,其中一
部分记录得关键字均比另一部分记录得关键字小,则可对这两部分记录继续进行排序,以达
到整个序列有序。
假设待排序序列为数组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 low<high //从表得两端交替地向中间扫描
while low
A[low]←A[high] //将比枢轴记录小得记录移到低端
while low<high &&A[low]<=pivotkey)dolow←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)所需时间。假设待排序列中记录就是随机排列得,则在一趟排序之后,k 取 1 至n 之间任何一值得概率相同,快速排序所需时间得平均值则为Tavg(n)=knInn,其中n 为待排序序列中记录得个数,k为某个常数。
通常,快速排序被认为就是,在所有同数量级(O(nlogn))得排序方法中,其平均性能最
好。但就是,若初始记录序列按关键字有序或基本有序时,快速排序将蜕化为起泡排序,其时
间复杂度为O(n^2)。
三、试验分析
1、试验环境
WIN 32系统,VC6、0
2、程序得执行
1)由函数datagenetare()生成20000 个在区间[1,100000]上得随机整数,并将随机整数保存到数组num[],接着调用函数WriteFile()将这些数输出到外部文件data、txt 中。
2)调用函数ReadFile()从data、txt中读取数据,并将其保存到数组num1[]中。接着对数组num1 进行直接插入排序,并计算与记录其运行时间。最后,调用函数WriteFile()将直接插入排序得结果写入resultsIS、txt,并记录运行时间为TimeIS。
3)调用函数ReadFile()从data、txt 中读取数据,并将其保存到数组num2[]中。