快速排序
1.算法描述
- 从数列中挑出一个元素,称为 "基准";
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
2.代码实现
void quick_sort(int q[],int l,int r)
{
if(l >= r) return ;
int i = l - 1,j = r + 1,x = q[l + r >> 1];
while(i < j)
{
do i ++ ;while(q[i] < x); // while(q[++ i] < x);
do j -- ;while(q[j] > x); // while(q[-- j] > x);
if(i < j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j + 1,r);
}
3.算法优化
如果我们把基准值总是选做第一个元素,这对某些近乎逆序的序列效果并不好,时间复杂度大大增加,因此我们可以采取随机选定基准的方法,如上面代码中选取中点来进行优化。
4.算法分析
- 稳定性:不稳定
- 时间复杂度:
- 最好情况:o(n)
- 最坏情况:o(\(n^2\))
- 平均情况:o(n\(log_2\)n)
- 空间复杂度:o(n)