- 36
- 0
- 约1.13万字
- 约 16页
- 2017-03-05 发布于重庆
- 举报
快速排序报告
《数据结构课程设计》报告
题目:快速排序问题
专业 计算机科学与技术 学生姓名 高海松 班级 B计116 学号 1110704605 指导教师 巩永旺 完成日期 2013年1月11日
目 录
1简介 3
2算法说明 5
3 测试结果 6
4分析与探讨 8
5小结 11
附录:源程序清单 11
一、简介
1、排序及排序算法类型
排序是数据处理领域和软件设计领域中一种常见而重要的运算。排序就是将一组记录(元素)的任意序列按照某个域的值的递增(从小到大)或递减(由大到小)的次序重新排列的过程。排序的目的之一就是为了方便查找。排序分为内部排序和外部排序。在内存中进行的排序叫内部排序,利用外部存储的排序叫外部排序。
内部排序的方法有很多,但就其全面性能而言,很难提出一种被认为是最好的方法,每一种方法都有各自的缺点,适合在不同的环境下使用。按照其策略不同,可归纳为五类:插入排序、交换排序、选择排序、归并排序和基数排序。
2、快速排序算法介绍
快速算法就像是它的名称所暗示的,是一种快速的分而治之的算法,平均时间复杂度为O(nlog2n)。它的速度主要归于一个非常紧凑并且高度优化的内部循环。其基本算法Quicksort(S)由以下4个步骤组成:
如果S中的元素的个数为0或1 ,则返回。
选择S中的任意一个元素v,v叫做支点(Pivot).
将S—{v}(剩下的元素在S中)分成两个分开的部分。L={x∈S—{v}|x≦v}和R={x∈S-{v}|x≧v}。
依次返回Quicksort(L)…+N=N(N+1)/2=O(N2)
(3)支点的选择:
错误方式:比较常见的不明智的选择就是把第一个元素作为支点。但如果输入是已经预先排过序的,或者是倒序的,该支点给出的分组就很糟糕,因为它是一个末端的元素;而且这种情况会在迭代中继续出现,会以O(N2)的时间复杂度而告终,所以选择第一个元素作为支点不是好的策略。
中位选择:把中间元素,即待排序序列中间位置的元素,作为支点是合理的选择。当输入已经排过序时,这种选择在每次递归调用中都会给出理想的支点。
中值划分:在上诉选择中使用中间值作为支点可以消除非随机输入时出现的退化情况。但这是一种消极的选择,就是说仅仅是试图避免一个坏的支点而并没有去尝试选择一个更好的支点。中值划分是一种选择比平均情况更好的支点的尝试。在中值划分中,一种比较简单而有效的策略是选择待排序列的第一个、中间一个以及最好一个记录这3个值的中值作为支点。同样道理,也可以从待排序列中等距离地选取5各值,并将这5各值的中值作为支点。
图1 快速排序的基本过程
4.各种排序算法比较
不同的排序算法有不同的时间和空间复杂性以及不同的排序稳定性。所谓排序算法的稳定性是指该算法不改变等值记录之间的先后顺序。表4.1列出了几种比较典型的算法在时间、空间复杂性以及算法稳定性方面的性能。
表1各种排序方法性能比较
排序方法 最好时间 平均时间 最坏时间 辅助空间 稳定性 直接插入排序 O(n) O(n2) O(n2) O(1) 稳定 冒泡排序 O(n2) O(n2) O(n2) O(1) 稳定 简单选择排序 O(n2) O(n2) O(n2) O(1) 不稳定 快速排序 O(nlog2n) O(nlog2n) O(n2) O(log2n) 不稳定 堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 不稳定 归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n) 稳定
由上表可知:
就平均时间性能而言,快速排序、堆排序和归并排序都有最好的时间性能。相对而言,快速排序速度最快。但快速排序在最坏情况下的时间性能达到了O(n2),不如堆排序和归并排序快。
就空间性能来看,直接插入排序、冒泡排序、简单选择排序、堆排序要求的辅助空间比较小。其中直接插入排序、冒泡排序、简单选择排序比较简单,容易实现,但时间性能较差。
二、算法说明
本实验的目的是设计并实现一种快速排序(Quicksort)的优化版本,并且比较在下列组合情况下算法的性能表现:
cutoff值从0~20。Cutoff值的作用是只有当数组的长度小于等于这个值时,才使用另一种简单排序方法对其排序,否则使用Quicksort算法排序。
选定支点的方法分别是“第一个元素”,“三个元素的中值”,“五个元素的中值”。
对上述的测试分别要采用顺序、逆序、随机三种类型的输入文件。
输入文件中测试数组的大小可以从1000个数到10000个
原创力文档

文档评论(0)