第八章 排序 五、快速排序

目录

一、算法思想

二、例子

三、代码实现

四、验证

五、算法效率分析

1、时间复杂度

​编辑

2、空间复杂度

3、小结

4、优化思路

5、稳定性

六、总结


一、算法思想

首先,选取一个数作为序列的基准数,分别定义序列的第一个数和最后一个数为low和high,让它们与基准数进行比较,如果low小于基准数,则low指针右移,反之将low指针所指元素移动到high指针所指的地方,high指针同理,以形成左边的序列都比基准数小,右边的序列都比基准数大。

二、例子

1、我们将此序列使用快速排序进行升序排序

第八章 排序 五、快速排序_第1张图片、2、选取49作为基准数,并将其存入缓存变量

第八章 排序 五、快速排序_第2张图片

3、左移high指针,让27与基准数49进行比较,27比49小,则把27移动到low所指的位置

第八章 排序 五、快速排序_第3张图片

4、此时high指针为空,我们切换到low指针进行比较,让27与49比较,发现它小于49,所以low指针右移,38同理,当移动到65时,发现65大于49,所以将65放在high指针处

第八章 排序 五、快速排序_第4张图片

5、此时low指针处为空,于是我们切换到high指针,将high指针右移,让它与13比较,将13移动到low指针处

第八章 排序 五、快速排序_第5张图片

6、切换到low指针,将low右移,97比49大,所以97移动到high指针处

第八章 排序 五、快速排序_第6张图片

7、右移high,直到与low相遇,此时我们得到了基准数49应该存放的位置为3

第八章 排序 五、快速排序_第7张图片

8、于是我们将序列划分为了两个部分

第八章 排序 五、快速排序_第8张图片

9、然后我们再次对划分后的两部分分别取基准数27和76,再次进行划分

第八章 排序 五、快速排序_第9张图片

第八章 排序 五、快速排序_第10张图片

10、最终得到第八章 排序 五、快速排序_第11张图片

三、代码实现

#include "bits/stdc++.h"
using namespace std;

int Partition(int a[],int low,int high){//划分函数
    int pivot = a[low];//把第一个数作为基准数
    while(low=pivot)--high;//从右边开始,找到比基准数小的数
        a[low] = a[high];//放到左边
        while (low

四、验证

第八章 排序 五、快速排序_第12张图片

五、算法效率分析

1、时间复杂度

第八章 排序 五、快速排序_第13张图片

2、空间复杂度

第八章 排序 五、快速排序_第14张图片

3、小结

第八章 排序 五、快速排序_第15张图片

最坏的情况是序列本身就是顺序或逆序的

第八章 排序 五、快速排序_第16张图片

4、优化思路

第八章 排序 五、快速排序_第17张图片

5、稳定性

不稳定

六、总结

第八章 排序 五、快速排序_第18张图片

你可能感兴趣的:(数据结构学习,数据结构)