思想
分而治之
void quickSort(int *begin,int *end)
{
int *p = begin;// 保存初始的起始位置
int *q = end;// 保存初始的结束位置
int *k = begin;//a[0]基准点,选择数组的第一个元素作为基准
if(begin >= end)// 基本情况检查:如果起始位置大于或等于结束位置,则返回
{
return;
}
while(begin<end) // 主要的划分循环
{
while(begin<end && *end>=*k)// 从右向左寻找一个小于或等于基准点的元素
{
--end;
}
while(begin<end && *begin<=*k)// 从左向右寻找一个大于基准点的元素
{
++begin;
}
swap(begin,end);// 交换找到的两个元素,使得左边的元素小于基准点,右边的元素大于基准点
}
swap(k,begin);// 将基准点放到正确的位置
// 递归调用,对基准点左边和右边的子数组进行排序
quickSort(p,end-1);
quickSort(begin+1,q);
}
实现思路
1.基准值选择
基准值 ——数组首元素a[0] ——基准值位置
2.从右边开始寻找
使用end指针 从右向左寻找到第一个比基准值小的数
3.从左边开始寻找
使用begin指针 从左向右寻找到第一个比基准值大的数
4.交换元素
将找到这两个数交换
继续重复2-4的过程
直到begin/end相遇,此时结束。
5.基准值交换
当begin和end相遇时,将基准值与当前位置的元素交换
将基准位置上值与此时begin/end所谓位置的元素交换
6.递归排序
继续对左一半和右一半进行快速排序
递归结束的条件
if(begin>=end)
{
return;
}
算法的时间复杂度
O(nlog(n))