最近在看算法导论,第七章讲的是快排算法。
本篇文章使用c++来实现:
书中的伪代码如下:
快排的核心思想是找出一个分割数组的元素,在小于该元素的数组索引对应的元素值小于该值,在大于该元素的索引的数组元素大于该值。当然等于也是可以的。本文是跟书中一致,选择数组中最后一个元素作为对比对象。
代码如下:
template<typename T>
void exchange(T& l, T& r)
{
T tmp = l;
l = r;
r = tmp;
}
template <typename T>
size_t partition(vector<T>& input, int p, int r)
{
T x = input[r];
int i = p - 1;
for (int j = p; j < r ; j++)
{
if (input[j] <= x)
{
i++;
exchange<T>(input[i], input[j]);
}
}
exchange<T>(input[i+1], input[r]);
return i + 1;
}
template <typename T>
void quick_sort(vector<T> &input, int p, int r)
{
if (p < r)
{
if (r == (p + 1))
{
if (input[p] > input[r])
exchange(input[p], input[r]);
}
else
{
int q = partition(input, p, r);
quick_sort<T>(input, p, q - 1);
quick_sort<T>(input, q + 1, r);
}
}
}