交换排序之快速排序原理、源码及时间、空间复杂度

快速排序的原理:分治策略和递归

分治策略

分治的基本思想是将原问题分解为若干与原问题结构相似的小问题,递归地解决这些小问题,小问题的解就组合为原问题的解。

基本方法

  1. 选基准
  2. 基准放中间,划分为左右两个区域(左小右大)
  3. 再递归地采用该方法分别解决左右两个区域的排序。

源码

尽可能地减少递归调用的次数

//quick_sort
template <class T>
int quick_sort(T* t, int s, int e)
{
	int compare_times = 0;
	bool right = true;
	T middle = t[s];
	int i = s, j = e;
	while(i < j)
	{
		if(right && (t[j] < middle))
		{
			t[i] = t[j];
			right = false;
		}
		else if(!right && (t[i] > middle))
		{
			t[j] = t[i];
			right = true;
		}
		right ? j-- : i++;
		compare_times++;
	}
	t[i] = middle;
	if(s < i-1)
	{
		int st = quick_sort(t, s, i-1);
		compare_times += st;
	}
	if(e > j+1)
	{
		int et = quick_sort(t, j+1, e);
		compare_times += et;
	}
	return compare_times;
}

template <class T>
int sort(T* t, int n)
{
	if(n > 1)
		return quick_sort(t, 0, n-1);
	return 0;
}

##执行结果
交换排序之快速排序原理、源码及时间、空间复杂度_第1张图片

时间复杂度

平均时间复杂度:
o ( n log ⁡ 2 n ) o(n\log_2 n) o(nlog2n)
最坏时间复杂度:(已经排好序的情况下)
o ( n 2 ) o(n^2) o(n2)

空间复杂度

递归调用时系统要保留栈空间
平均空间复杂度:
o ( log ⁡ 2 n ) o(\log_2 n) o(log2n)
最坏空间复杂度:(已经排好序的情况下)
o ( n ) o(n) o(n)

你可能感兴趣的:(基本算法)