天天看点

❤️全面图解快速排序,详细图文并茂解析!❤️

写在前面:

大家好,我是时光。 今天给大家带来的是排序算法中的快速排序。 我采用图解方式讲解,争取写透彻。话不多说,开始!

思维导图:

❤️全面图解快速排序,详细图文并茂解析!❤️

通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。主要采用<code>分治法</code>和<code>挖坑填数</code>等方法,分治法就是大问题分解成各个小问题,堆小问题求解,使得大问题得以解决。

我们先搞清楚这个堆排序思想,先把逻辑搞清楚,不着急写代码。

我们首先有一个无序数组,比方说

基准数(枢轴),取数组的第一个元素,此时基准数:arr[0]=4

❤️全面图解快速排序,详细图文并茂解析!❤️

并定义两个变量i和j分别指向无序数组的第一个元素start和最后一个元素end。

分区过程,将比基准数大的数全放到它的右边,比基准数小的或者相等的数全放到它的左边。

我们首先把第一个元素arr[0]=4定义为基准元素,此时数组第一个位置就是坑,那么我们要从数组的右边向左开始查找小于基准数的元素,并与坑互换位置。

❤️全面图解快速排序,详细图文并茂解析!❤️

换好位置之后,现在转换,从数组的左边向右边查找比基准数大的元素:

❤️全面图解快速排序,详细图文并茂解析!❤️

换好位置之后,现在又重新开始从数组右边向左边开始查找,比基准数小的元素:

❤️全面图解快速排序,详细图文并茂解析!❤️

不断重复此类操作,直到分成左右两个分区,再把基准数填入坑中,这样第一趟排序完成。如下:

❤️全面图解快速排序,详细图文并茂解析!❤️

这里,我们对分好的两个区间重复进行上述分区操作,直到每个区间只有一个元素为止。

❤️全面图解快速排序,详细图文并茂解析!❤️

重复进行以上操作,直到左右两边分区都是有序排列,整个排序过程也就完成了:

快速排序最坏时间复杂度是<code>o(n^2)</code>,最好的时间复杂度为<code>o(nlogn)</code>,从而平均时间复杂度最后算出来也是<code>o(nlogn)</code>。

空间复杂度是<code>o(1)</code>,因为没有用到额外开辟的集合空间。

快速排序是不稳定的排序算法。因为我们无法保证相等的数据按顺序被扫描到和按顺序存放。

最坏时间复杂度是<code>o(n^2)</code>,最好的时间复杂度为<code>o(nlogn)</code>,从而平均时间复杂度最后算出来也是<code>o(nlogn)</code>。

堆排序: 全面图解堆排序 归并排序:全面图解归并排序
链表: 数组和链表 顺序表 单链表 栈: 栈的顺序存储, 栈的链式存储 二叉树: 二叉树递归遍历 二叉树非递归遍历 hashmap: hashmap数据结构详解 java集合: arraylist详解

继续阅读