一、原理
以序列中的一个数为标准,用这个数和序列中的每一个数比较(有指定的方法),使其左边的数都不大于它,右边的数都不小于它。然后在对左右两边的子序列做同样的操作。例如:
初始状态:
{ 49 38 65 97 76 13 27 }
进行一轮快速排序之后变为:
{ 27 38 13 } 49 { 76 97 65 }
在分别对前后两部分进行相同的操作,最后的有序序列为:
{ 13 } 27 { 38 } 49 { 65 } 76 { 97 }
下面我们以初始状态为例,看看序列 { 49 38 65 97 76 13 27 } 如何变成 { 27 38 13 } 49 { 76 97 65 } 。这里我们可以想象有两个游标,分别指向27和49,然后以序列中的一个数作为标准,这里选择49,最后就是具体的比较过程了:
49和27比,27比49小,交换:
{ 27 38 65 97 76 13 49 }
49和38比,38比49小,不交换:
{ 27 38 65 97 76 13 49 }
49和65比,65比49大,交换:
{ 27 38 49 97 76 13 65 }
49和13比,13比49小,交换:
{ 27 38 13 97 76 49 65 }
49和97比,97比49大,交换:
{ 27 38 13 49 76 97 65 }
49和76比,76比49大,不交换:
{ 27 38 13 49 76 97 65 }
前后游标都指向49了,这一轮排序结束。
二、编程实现
以下是C语言代码:
#include <stdio.h>
void quiksort(int a[], int low, int high)
{
int i = low;
int j = high;
int temp = a[i];
if (low < high)
{
while (i < j)
{
//从后向前,找到第一个小于标志值的元素
while ((a[j] >= temp) && (i < j))
{
j--;
}
a[i] = a[j];
//从前向后,找到第一个大于标志值的元素
while((a[i] <= temp) && (i < j))
{
i++;
}
a[j] = a[i];
}
a[i] = temp;
quiksort(a, low, i-1);
quiksort(a, j+1, high);
}
else
{
return;
}
}
void main()
{
int i;
int array[7] = { 49, 38, 65, 97, 76, 13, 27 };
quiksort(array, 0, 6);
for (i = 0; i < 7; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
输出结果:
13 27 38 49 65 76 97
三、特点
1、不稳定的。
2、时间复杂度O(nlog2n)。
3、平均性能最好的一种排序算法。
4、快速排序法的性能最差情况为O(n^2)。