0x01 快速排序思想
采用分治策略,分治法的基本思想是将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解决这些子问题,然后将这些子问题的解组合为原问题的解。
对于快速排序来说,也就是三步:分解、求解、组合
在求解部分结束后,左右两个子区间已经有序,组合部分就什么也不用做了
0x02 代码
#include <stdio.h>
// 划分算法
int Partition(int *R, int i, int j)
{
int key = R[i];
while(i < j) // 从区间两端交替向中间扫描,直到i=j为止
{
while(i < j && R[j] >= key)
j--;
if(i < j)
R[i++] = R[j];
while(i<j && R[i] <= key)
i++;
if(i < j)
R[j--] = R[i];
}
R[i] = key;
return i;
}
// 快速排序算法
void QuickSort(int *R, int low, int high)
{
int pivotpos;
if(low < high) // 仅当区间长度大于1时才排序
{
pivotpos = Partition(R, low, high); // 划分
QuickSort(R, low, pivotpos-1); // 左区间递归排序
QuickSort(R,pivotpos+1,high); // 右区间递归排序
}
}
// 测试用main函数
int main()
{
int aa[10];
printf("\nPlease input 10 num:\n");
for(int i=0; i < 10; i++)
{
scanf("%d",&aa[i]);
}
QuickSort(aa,0,9);
for(int i = 0; i < 10; i++)
printf("%d ",aa[i]);
printf("\n");
return 0;
}
0x03 复杂度
快速排序法是一种不稳定的排序方法
时间复杂度:平均O(n x lgn/lg2) 最差 O(n*n)
空间复杂度:O(Log n)
整理自《程序员面试宝典》