基本算法模板之快速排序

快速排序

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)
posted @ 2023-03-16 18:57  知凹  阅读(47)  评论(0)    收藏  举报