函数递归需要借助栈来保存中间状态信息,由此需要大量的栈空间,减少递归层次,一伙减少递归保存的中间参数信息,均可以避免stackoverflow的出现。
int Partition(int *p,int len,int start,int last)
{
int flag=*(p+start);
int i=start;
int j=last;
while(i<j)
{
while(i<j && *(p+j)>flag) --j;
*(p+i)=*(p+j);
while(i<j && *(p+i)<=flag) ++i;
*(p+j)=*(p+i);
}
*(p+i)=flag;
return i;
}
void QuickSort(int *p,int len,int start,int last)
{
if(NULL=p) return;
int index;
while(start<last)
{
index=Partition(p,len,start,last);
QuickSort(p,len,start,index-1);
//QuickSort(p,len,index+1,last);
start=index+1;
}
}
参考文章:
http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html
http://www.cnblogs.com/JeffreyZhao/archive/2009/03/26/tail-recursion-and-continuation.html