步骤:
Divide:从列表中取一个元素作为支点,将数组分为A[p‥q - 1] andA[q + 1‥r] ,A[p ‥ q - 1]中每一个元素都小于A[q] , 而A[q + 1 ‥ r]中每个元素都大于A[q].计算出支点实际存在数组中的位置,即q的值就是PARTITION操作。
Conquer:通过递归的方法对两个数组进行排序
Combine:因为子数组是原地处理的(即in-place),所以不需要合并他们,A[p....r]已经是排好序的。
平均时间复杂度是O(nlgn);
#include <stdio.h>
void quickSort(int *pstart, int *pend)
{
if(pend > pstart)
{
int *phead = pstart;
int *ptail = pend;
int num = *pstart; // 作为基准数字
while(ptail > phead)
{
if(*phead > *ptail)
{
int temp = *phead;
*phead = *ptail;
*ptail = temp;
}
if(*phead != num)
{
++phead;
}
else
{
--ptail;
}
}
quickSort(pstart, phead-1);
quickSort(phead+1, pend);
}
}
int main()
{
int arr[] = {-3,-5,0,-2,5,1,6,-2,8,7,-9,20};
int i = 0;
quickSort(arr, arr+12);
for(i = 0; i < 12; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}