快速排序(简称快排):
为什么叫它快速排序呢,在我自己的理解里,因为快速排序的每一步排序过程都使得:有某个位置i,
经一步排序后,数组i位置上的值为完整排序后的数值, 即排序过程的每一步都较之整个排序过程快一步
获得一个已正确排序的数值,所以叫它 ‘快速’ 排序。 假设快速排序由n步的process过程组成,对于数
组A[size],快排每次调用process后,有某个值i, 使得A[i]的数值为正确排序后的数值, 并且任何位于i位
置之前的元素都小于等于A[i], 任何位于i之后的元素都大于等于A[i]。
具体来说: 现在对数组A[5] = { 0, 2, 3,1,4 }, 调用快排算法,而快排算法则多次调用process子
过程, 则每个调用过程后数组的结果可能为:
A[5] = { 0, 1, 3, 2, 4 }
A[5] = { 0, 1, 2, 3, 4 }
A[5] = { 0, 1, 2, 3, 4 }
A[5] = { 0,1, 2, 3, 4 }
红色标出的元素为算法每一步所正确 ‘置位’ 的元素。实际上快排也蕴含了分治思想(divide、conquer、merge)。
采用了二分法设计函数。
以下是快排代码(C/C++):
template <typename T>
//p,r are the corresponding index of array head and tail
void quick_sort (T* A, int p, int r)
{
if (p < r)
{
int q = partition<T> (A, p, r);
quick_sort<T> (A, p, q - 1);
quick_sort<T> (A, q + 1, r);
}
}
template <typename T>
//p,r representing the same meaning as above
int partition (T* A, int p, int r)
{
T x = A[r];
int i = p - 1;
for (int j = p; j <= r - 1; ++j)
if (A[j] <= x)
{
++i;
T temp = A[i];
A[i] = A[j];
A[j] = temp;
}
T temp = A[i + 1];
A[i + 1] = A[r];
A[r] = temp;
return i + 1;
}
quick_sort就不多说了,partition函数即之前陈述的process子过程:将某个位置i上的元素正确 ‘置位’ ,并使i左边的
元素小于等于它,使右边的元素大于等于它。
For detail information, see Introduce to algorithm.