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