关键:对序列(数组)的划分,划分后的数组满足:
- a[i]位于某个位置
- a[0], … , a[i-1]小于a[i]
- a[i+1], … , a[r]大于a[i]
快速排序算法的平均效率:O(n(Lgn)),最坏时退化到O(n2)
算法:
//快速排序
template <class Item>
void QSort(Item a[], int left, int right)
{
if (right <= left)
return;
int i = Partition(a, left, right);
QSort(a, left, i-1);
QSort(a, i+1, right);
}
//选择a[right]为分割,然后扫描数组
template <class Item>
int Partition(Item a[], int left, int right)
{
int i = left-1, j = right;
Item v = a[right];
for(;;)
{
//++i这样的语句先运算再比较,对于其他语言,可以使用类似Do…Loop
的语句
while(a[++i] < v);
while(v < a[--j])
{
if (j == left) break;
}
if (i >= j) break;
exch(a[i], a[j]);
}
exch(a[i], a[right]);
return i;
}