核心思想
先选取一个数字作为基准数,然后进行分类操作,将比基准数小的放到基准数的前两,比基准数大的放到基础数的后面。
-
划分问题:将数组的各个元素重排后分成左、右两个部分,使得左边的任意元素都小于或等于右边的任意元素。是按照值进行划分。
-
递归求解:把左右两部分,分别排序
在快速排序中,算法的主要工作在于划分阶段,而不需要再去合并子问题的解了。它和归并的区别在于,归并需要将两个部分和明后,才能保证,整体有序,而快速排序的子部分有序后,整体就自然有序了。
基准数的选取
选取标准有很多,有选取第一个数作的,有将中间的数,也有随机进行的。
- 随机快速排序,使用随机的元素作为中轴
- 三平均划分法,以数组最左边、最右边和最中间的元素的中位数作为中轴
- 当子数组足够小是(5~15),改用插入排序方法
- 一些划分方法的改进。三路划分,将数组分成三段,每段的元素分别小于,等于,大于中轴元素。
如何实现分类
附设两个指针i和j,它们的初值分别是l和r,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小于mid的记录,然后从i所指位置起向后搜索,找到第一个关键字大于mid的记录,将它们互相互换,重复这两步直至i>j为止。
void qSort(int l,int r)
{
int i,j,mid,p;
i=l;j=r;
mid=a[(l+r)/2];// 定义分隔数
do{
while(a[i]<mid)i++;//在左侧寻找比中间数大的
while(a[j]>mid)j--;//在右侧寻找比中间数小的
if(i<=j)
{
swap(a[i],a[j]);
i++;j--;
}
}while(i<=j);
if(l<j) qSort(l,j);
if(i<r) qSort(i,r);
}