快速排序
快速排序与冒泡排序一样,同样是属于交换排序
叫做快速排序也是有原因的。因为它采用了分治法的概念
其中最重要的一个概念就是 基准元素
冒泡排序每一轮将一个最大的元素挑选出并移动到右侧。
分治法思想
在每一轮当中。通过确定基准元素,将元素分为两部分,分别大于小于基准元素。而后的一轮中。还是通过原来的方式,在这两轮中继续找寻基准元素,直至不可再细分为止。
最重要的两个地方:
基准元素的选择 pivot
基准元素的确认一般是选择当前数列的第一个元素,但这种方法确实不太靠谱,一般情况会通过随机选择的方式选择一个基准元素。这样一来,也能避免某些特殊数列
导致的时间复杂O(N^2);
通过随机选择的方式,可以将时间复杂度调整至O(Nlogn);
元素的移动
通过随机的方式选择元素后,接下来就是元素的移动
移动就是将元素分别移动到基准元素两侧,左侧比基准元素小,右边则比基准元素大。
这里有两种元素的移动方式:
- 挖坑法
- 指针交换法
挖坑法
拟定一个无序数列{4,7,6,5,3,2,9,1}要求将这个数列从小到大依次排列,我们采用挖坑法进行实现。
挖坑法最重要的地点在于:指定左右指针(left,right)基准元素下标index。基准元素Pivot.
假设我们通过随机法选择基准元素Pivot = 4
它的下标index=1
表示一个坑,并且选择了左右的指针left/right
。
1、从右边指针right
开始 和基准元素进行比较。若右指针元素大于基准元素,则指针向下移动一位。若小于则将这个元素填入坑里面。将坑的位置记录下来。
此时我们的右边指针元素
1<4
则将右边指针元素1
填入首位的坑index
里面。这个时候因为1已经跑到首位去了。所以当前的位置就又成为了一个新的坑,接下来要操作左边指针left
将左边指针移动一位。如下图所示