2024年4月14日发(作者:)
快速排序
一、问题描述
排序是数据结构中典型的算法,经常有插入排序、选择排序、快速排序等。本文要求
对排序表中的无序数据进行快速排序,并讨论快速排序的改进方法(双倍快速排序、基于
归并的快速排序),这样可以对排序进行优化,提高效率。
二、基本要求
1、选择合适的存储结构建立排序表,并能遍历表输出元素。
2、编写快速排序算法,并能够输出排序的结果。
3. 快速排序及其改进—双倍快速排序和基于归并的快速排序算法。
三、测试数据
输入以下数据:5 、3、7、11、1、9、4、8
四、算法思想
1、普通快速排序的基本思想:可以运用一趟快速排序把序列分成分割成独立的两部分,
其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进
行快速排序,以达到整个序列有序。一趟的快速排序是:附设两个指针low和high,它们
/u/1810231802
的初值分别为low和high,设枢轴记录的关键字为pivotkey,则首先从high所指位置起
向前搜索到第一个关键字小于pivotkey大的记录和枢轴记录互相交换,然后从low所指
位置向后搜索,找到第一个关键字大于pivotkey的记录和枢轴记录互相交换,重复这两部
直至low=high为止。
2、双倍快速排序思想:快速排序的基本思想是基于分支策略的思想。即对于输入的子
序列L[low..high],如果规模足够小则直接进行排序,否则分三步处理:
1) 分解(Divide) :设输入的序列L[low..High],确定支点元素L[low]和L[High],并使
L[Low].key<=Ll[High].key ,然后分解(Divide):将序列L[low ..High ]划分成三个子序列
L[Low..L-1]、L[L+1..H-1]和L[H+1..High],使L[low ..High]中元素的关系为
L[Low..L-1] 2) 递归求解(Conquer) :通过递归调用快速排序算法分别对L[Low..L-1]、L[L+1..H-1] 和L[H+1..High]分别进行分解排序。 3) 合并(Merge):对分解出的三个子序列的排序是就地进行的,所以在L[Low..L-1]、 L[L+1..H-1] 和L[H+1..High]都排好序后不需要执行任何计算L[low..High]就已排好序。 3、基于归并的快速排序:对划分结果产生的两个子序列的长度进行检查,如果其中一 个与另一个的长度比超过某一界限,则认为这是一个“畸形划分”,对较短的子序列继续使 用“快速排序”,而把较长的子序列平分为两个子序列分别排序,然后再进行一次合并。两 个有序序列的合并是可以实现为线性的时间复杂度的,因此可以在每次都是畸形划分时仍 然获得 O(N*LogN) 的时间复杂度。其中Partition就是众所周知的用于“快速排序”的划分 子程序,Merge(Data, First,Size)把Data中[0,First)和[First, Size)两个有序列合并为一个 /u/1810231802


发布评论