一、算法思路
快速排序(quicksort)是实践中已知的排序算法中最快的。
快速排序采用一种分治策略:
1、选择一个基准值x=A[q]将数组A[p...r]分割为3个部分,左边A[p...q-1],中间A[q],右边A[q+1...r]。其中A[p...q-1]中的每个元素都小于等于A[q],A[q+1...r]的每个元素都大于等于A[q]。
2、通过递归调用,对数组A[p...q-1]和A[q+1...r]重复上述步骤。直至输入的数组元素个数为1或0,则排序结束。
二、代码实现
#include <stdio.h>
void QuickSort(int* A, int n)
{
// 递归结束条件:数组有1个或0个元素
if (n <= 1)
return;
int tmp = 0;
int base = *A; // 选取数组的第一个元素作为基准值
/**
* 记录分割位置
*
* 位置0—>j的元素小于等于基准值
* 位置j—>i的元素大于等于基准值
* 位置i—>n-1的元素还未进行分组
*/
int j = 0;
for (int i=1; i<=n-1; ++i)
{
if (*(A+i) < base)
{
j += 1;
// 交换位置i和j上的元素
tmp = *(A+i);
*(A+i) = *(A+j);
*(A+j) = tmp;
}
}
// 循环结束把位置j的元素与基准值交换
tmp = *A;
*A = *(A+j);
*(A+j) = tmp;
// 递归调用QuickSort对基准值左边序列进行排序
QuickSort(A, j);
// 递归调用QuickSort对基准值左边序列进行排序
QuickSort(A+j+1, n-j-1);
}
int main()
{
int A[10] = {7,8,1,4,6,5,3,9,10,2};
QuickSort(A, sizeof(A)/sizeof(A[0]));
for (int i=0; i<sizeof(A)/sizeof(A[0]); ++i)
{
printf("%d ", A[i]);
}
printf("\n");
return 0;
}
三、性能分析
1、快速排序的平均时间复杂度为O(N㏒N),在最坏情况下会达到O(N²)。
2、当选择的基准值为数组中的最大或最小数时,快速排序的性能最差,因为所有元素都被分割到了同一边
3、基准值选择为所有元素的中位数时,快速排序性能最好,所有元素被平均分成了两部分