快速排序之“挖坑法”

想要了解快速排序,我们将其与冒泡排序加以对比说明。

快速排序

(都是交换排序:通过元素之间的比较和交换位置来达到排序的目的)是从冒泡排序演变而来的算法,但是比冒泡排序要高效得多。因为其使用了【分治法】。

快速排序的操作过程:在每一轮挑选一个基准元素,并让其他比他大的元素移动到数列一边,比他小的元素移动到数列另一边,从而把数列拆解成了两个部分。(分治法的思路)

快速排序之“挖坑法”_第1张图片

紫色:基准元素

黄色:不基准元素大的元素

绿色:比基准元素小的元素

基准元素的选择

一般情况下选择第一个元素,这在绝大多数情况下是没有问题的。

但是最坏的情况下,若是一个逆序的数列,期望排成顺序数列,这种情况下,快速排序需要进行N轮,时间复杂度与冒泡排序一样为O(N^2)。所以为了避免这种情况的发生,我们可以随机选择一个元素作为基准元素

元素的移动

把其他元素当中小于基准元素的的都移动到基准元素一边,大于基准元素的移动到另一边。

实现方法:

挖坑法

首先我们选定基准元素Pivot,并记住这个位置index,这个位置相当于一个“坑”,并且设置两个指针 left 和 right ,指向数列的最左和最有两个元素。

快速排序之“挖坑法”_第2张图片

接下来,从right指针开始,把指针所指向的元素和基准元素做比较。如果比pivot大,则right指针向左移动;如果比pivot小,则把right所指向的元素填入坑中

4>2,所以4的位置不变,将right指针左移继续比较,right右边黄色的区域代表着大于基准元素的区域。

1<2,所以把1填入基准元素所在位置,也就是坑的位置。这时候,元素1本来所在的位置成为了新的坑。同时,left向右移动一位。


此时,left左边绿色的区域代表着小于基准元素的区域,接下来,我们切换到left指针进行比较。如果left指向的元素小于pivot,则left指针向右移动;如果元素大于pivot,则把left指向的元素填入坑中。

快速排序之“挖坑法”_第3张图片


下面按照这个思路继续排序:

快速排序之“挖坑法”_第4张图片

这时候,把之前的pivot元素,也就是2放到index的位置。此时数列左边的元素都小于2,数列右边的元素都大于2,这一轮交换终告结束。

你可能感兴趣的:(快速排序之“挖坑法”)