一、快速排序的思想
快速排序是生活中比较常用的一种排序算法,它的特点就像它的名字一样速度快、效率高。
快速排序采用的思想是分治思想,先简单介绍一下分治思想。分治思想的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可以得到原问题的解。
既然快速排序用到了分治的思想,那么也就是说快速排序也就和分治算法一样为了进行排序需要先对其划分的子区间进行排序。其基本思想就是:在待排序的序列中选取一个值作为一个基准值,按照这个基准值的大小将这个序列划分为两个子序列,基准值会在这两个子序列的中间,一边是比基准值小的,另一边是比基准值大的。 这样快速排序第一次排完,我们选取的这个基准值就会出现在它该出现的位置上。 这就是快速排序的单趟算法,也就是完成了一次快速排序。然后再对这两个子序列按照同样的方法进行排序,直到只剩下一个元素或者没有元素的时候就停止,这时候所有的元素都出现在了该出现的位置上。
二、快速排序的单趟算法
关于快速排序的单趟算法,我所熟知的有三种方法:左右指针法、挖坑法、前后指针法。
1、左右指针法:
左右指针法的实现思路:在一段区间内我们有一个值key,从左区间进行遍历,直到找到一个大于key的值就停下来,然后再从右边开始找小于key的值,找到一个也停下来,然后将左右的值进行交换,那样左边那个大于key的值就被换到了右边,而右边那个小于key的值就被换到了左边。当左右两个指针相遇的时候就说明所有的元素都与key做过了比较。然后再将左指针所在的元素赋给key,此时按照上述方法进行递归实现[left,key]和[key+1,right]。
//1.左右指针法
int PartSort1(int *a,int left,int right)
{
int& key = a[right]; //此处必须用引用才能达到后面用key作为交换值的效果
int begin = left;
int end = right;
while(beg