快排递归特点:双分枝、动态递归
实现:维护递归点记录栈
#include "stdio.h"
void quickSort(int A[]);
void main()
{
int A[] = {5,9,10,4,6,2,8,7,90,77,5,9};
int i;
quickSort(A,(sizeof(A)/sizeof(int)));
for(i=0;i<12;i++)
printf("%d/t",A[i]);
scanf("%d",&i);
}
void quickSort(int A[],int len)
{
int h = 0;
int r = len - 1;
int i,j,t; //选定段的最后一个元素为划分元
int *B;
int k = 0;
B = (int *)malloc( (r+1) * sizeof(int) );
*B = r;
i = h;
j = r-1; //选定段的最后一个元素为划分元
while(1)
{
if(i > j) break;
while( i<=j ) //<= :当i=j=r-1时,要比较A[i]、A[r]
{
while( (A[i] <= A[r]) && i<r ) i++;
while( (A[j] > A[r]) && j>=i ) j--; //允许j跳过i,让while跳出
if(i < j)
{
t = A[i];
A[i] = A[j];
A[j] = t;
}
}
/* 划分元入位*/
t = A[i];
A[i] = A[r];
A[r] = t;
/* 维护栈*/
k++;
*(B+k) = i;
/* 下次递归段范围*/
if( i-h <= 1 )
{
do
{
h = (*(B+k)) + 1; //左半段起点
k--;
if( -1 == k )
break;
r = (*(B+k)) - 1;
}while(r <= h);
i = h;
j = r - 1;
}
else
{
r = i - 1;
i = h;
j = r - 1;
}
}
}