算法排序问题实验报告

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

《排序问题求解》实验报告

一、算法的基本思想

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 j>0 and A[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

while low=privotkey do high←high-1

A[low]←A[high] //将比枢轴记录小的记录移到低端

while low

A[high]←A[low] //将比枢轴记录大的记录移到高端

A[low]←A[0] //枢轴记录到位

return low //返回枢轴位置

二、算法的理论分析

1. 直接插入排序算法理论分析

从空间来看,直接插入排序只需要一个数的辅助空间;从时间来看,直接插入排序的基

本操作为:比较两个关键字的大小和移动记录。先分析一趟直接插入排序的情况。伪代码InsertionSort 中 while 循环的次数取决于待插入的数与前 i-1 个数之间的关系。若

A[i]

若待排序数组是随机的,即待排序数组中的数可能出现的各种排序的概率相同,则我们可取上述最小值和最大值的平均值,作为直接插入排序时所需进行数间的比较次数和数的移动次数,约为 n^2/4。

因此直接插入排序算法,在最佳情况下的时间复杂度是 O(n),在最坏情况下的时间复杂度为 O(n^2)。

2. 快速排序算法理论分析

下面我们来分析快速排序的平均时间性能。

假设 T(n)为对 n 个记录 A[1..n]进行快速排序所需时间,则由算法 QuickSort 可见:其中,Tpass(n)为对 n 个记录进行一趟快速排序 Partition(A,1,n)所需的时间,从一趟快速排序算法可见,其和记录数 n 成正比,可以用表示(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[]中。接着对数组 num2 进行快速排序,并计算和记录其运行时间。最后,调用函数 WriteFile()将快速排序的结果写入 resultsQS.txt,并记录运行时间为 TimeQS。

3、试验数据

当N=20000时:

相关文档
最新文档