在选择pivot时,一般假设每次总是以当前表中的第一个元素作为枢轴值对表进行划分,则必须将表中比枢轴值大的元素向右移动,比其小的向左移动。
int Partition(ElemType A[], int low, int high)
{
ElemType pivot = A[low];//将当前表中的第一个元素设为枢纽值,对表进行划分
while(low < high)//循环跳出的条件
{
while(low<high && A[high]>=pivot)
--high;
A[low]=A[high];//将比枢纽值小的元素移动到左端
while(low<high && A[low]<=pivot)
++low;
A[high]=A[low];//将比枢纽值大的元素移动到右端
}
A[low]=pivot;//枢纽元素存放到最终的位置
return low;//返回存放枢纽值的最终位置
}
void QuickSort(ElemType A[], int low ,int high)
{
if(low<high)
{
int pivotPos=Partition(A, low, high);
QuickSort(A, low, pivotPos-1);
QuickSort(A, pivotPos+1, high);
}
}
快速排序构成一个递归树,递归深度即为树的高度。当枢纽值每次都将子表等分时,此时递归树的高为log2n(2为底数),当枢纽值,每次都是子表的最大值或者最小值时,此时递归树退化为单链表,树高为n;