首页 理论教育 中学版C++语言-快速排序算法

中学版C++语言-快速排序算法

时间:2023-08-13 理论教育 版权反馈
【摘要】:快速排序是在冒泡排序基础上的优化排序法,几乎是目前所有排序方法中速度最快的方法。在快速排序中,数据比较是从两端向中间进行的,一次同时从两个子序列中进行比较定位,减少了比较次数和交换次数。

中学版C++语言-快速排序算法

快速排序是在冒泡排序基础上的优化排序法,几乎是目前所有排序方法中速度最快的方法。在快速排序中,数据比较是从两端向中间进行的,一次同时从两个子序列中进行比较定位,减少了比较次数和交换次数。

基本思想:在当前无序区R[1..H]中任取一个数据元素作为比较的“基准”(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

排序过程如下。

假设n=8,有下列8个数,要求按从小到大的顺序排列,每次交换时数据的变化如下。

初始:[49 38 65 97 76 13 27 49]

一次划分过程(选第一个元素49为基准,I从左向右移动,J从右向左移动)后,各趟排序之后的状态:

第一次交换后:[27 38 65 97 76 13 49 49]

第二次交换后:[27 38 49 97 76 13 65 49]

J向左扫描,位置不变,第三次交换后:[27 38 13 97 76 49 65 49](www.xing528.com)

I向右扫描,位置不变,第四次交换后:[27 38 13 49 76 97 65 49]

通过一次划分,将49放在它应有的位置,然后再对它左、右两个序列进行快速排序,每次的结果如下:

初始:[49 38 65 97 76 13 27 49]

第一趟排序之后,划分子序列:[27 38 13] 49  [76 97 65 49]

第二趟排序之后:[13] 27  [38] 49  [49 65] 76  [97]

第三趟排序之后:13 27 38 49 49  [65] 76 97

最后的排序结果:13 27 38 49 49 65 76 97

对无序区r[ll,lr]做划分,算法用函数描述如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈