快速排序的原理:分治策略和递归
分治策略
分治的基本思想是将原问题分解为若干与原问题结构相似的小问题,递归地解决这些小问题,小问题的解就组合为原问题的解。
基本方法
- 选基准
- 基准放中间,划分为左右两个区域(左小右大)
- 再递归地采用该方法分别解决左右两个区域的排序。
源码
尽可能地减少递归调用的次数
//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;
}
##执行结果
时间复杂度
平均时间复杂度:
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)