排序算法还有一个重要的排序就是快速排序,快速排序最重要的特点就是“快”。那么今天范范老师带领大家来掌握这个快速排序。

快速排序的思想如下:在列表中取一个元素A(初始时选择列表中第0位的元素),是该元素A放入到列表合适的位置(即保证列表被元素A分为两个部分,左边部分要全部比元素A小,右边部分要全部比元素A大)。以此类推最终完成将无序的列表变为有序的列表。

具体的我们举例说明:

创建一个无序的列表,默认在列表的第0位上创建一个left指针,在列表的第5位上创建一个right指针,如下图所示:

排序算法——快速排序_快速排序

此时我们从列表中抽取列表中第0位的元素3作为tmp值从列表中拿走并存起来,此时列表中产生了一个空位,如下图所示:

排序算法——快速排序_快速排序_02

此时right指针指向的元素大于元素3,所以其向左移动一位去找比元素3小的元素,当right指正移动到列表的第4位时发现该位的元素2小于元素3,此时将元素2放入到列表的第0位上(即元素3空出来的位置),如下图所示:

排序算法——快速排序_排序算法_03

排序算法——快速排序_快速排序_04

此时left指针指向的是元素2,其比元素3小,所以其向右移动一位去寻找列表中比元素3大的元素,当left移动到列表的第1位上时发现该位置的元素4比元素3大,此时将该元素移动到right指针指向的位置上即列表的第4位上也就是原来元素2的位置上,如下图所示:

排序算法——快速排序_排序算法_05

此时right指针指向的元素是4,其比3大,所其向左移动一位去寻找列表中比元素3小的元素,当right移动到列表的第3位上发现该位置的元素1比元素3小,此时将该元素移动到left指针指向的位置上即列表的第1位上也就是原来元素4的位置上,如下图所示

排序算法——快速排序_快速排序_06

此时left指针指向的元素是1,其比元素3小,所以向右移动一位去寻找列表中比元素3大的元素,当left移动到列表的第2位上发现该位置的元素5比元素3大,此时将该元素移动到right指针指向的位置上即列表的第2位上也就是原来元素1的位置上,如下图所示:


排序算法——快速排序_排序算法_07

此时我们向左移动right指针发现此时right=left,此时这个位置就是存放元素3的位置,此时该位置我们也打上一个指针mid,如下图所示:此时我们发现元素3的左边全比它小,而它的右边全比它大

排序算法——快速排序_快速排序_08

此时我们惊奇的发现,此时列表还是无序的,那么接下来我们开始第二轮快速排序,此时我们将列表分为两个无序的区域,一个是21 另一个是547

接下来我们从21这个无序区域进行快速排序

排序算法——快速排序_排序算法_09

此时我们从列表中抽取列表中第0位的元素2作为tmp值从列表中拿走并存起来,此时列表中产生了一个空位,如下图所示:

排序算法——快速排序_快速排序_10

此时right指针寻找比元素2小的元素,此时发现列表的第1位元素1小于元素2,此时将元素2移动到left指针指向的位置即列表第0位,如下图所示
排序算法——快速排序_快速排序_11

此时left指针向右移动,此时发现left=right,此时这个位置就是存放元素2的位置,此时该位置我们也打上一个指针mid,如下图所示:此时我们发现元素2的左边全比它小,而它的右边全比它大

排序算法——快速排序_快速排序_12

接下来我们从547区域进行快速排序

排序算法——快速排序_排序算法_13

此时我们从列表中抽取列表中第0位的元素5作为tmp值从列表中拿走并存起来,此时列表中产生了一个空位,如下图所示:

排序算法——快速排序_快速排序_14

此时right指针指向元素是7,其比5大,所以其向左移动一位去寻找列表中比元素5小的元素,当right移动到列表的第1位是发现该元素4小于元素5,此时将该元素4移动到left指针指向的位置即列表的第0位,如下图所示

排序算法——快速排序_快速排序_15

此时left指针的元素是4,其小于元素5,那么其向右移动一位去寻找列表中比元素5大的元素,移动一位后发现和right指针重合,即left=right此时发现这个位置就是存放元素5的位置,此时该位置我们也打上一个指针mid,如下图所示:此时我们发现元素5的左边全比它小,而它的右边全比它大

排序算法——快速排序_快速排序_16

最终完成了该列表的排序,如下图所示:

排序算法——快速排序_排序算法_17


接下来我们用代码来实现快速排序:

排序算法——快速排序_排序算法_18

排序算法——快速排序_排序算法_19排序算法——快速排序_快速排序_20

运行结果如下所示:

排序算法——快速排序_排序算法_21