本人用入栈出栈来模拟递归的过程,下面是栈的结构和递归代码和非递归:
typedef struct
{
int *base;
int top;
}Stack;
void Nonrec_QuickSort(SqList &L,int low,int high)
//非递归的快速排序
{
if(low>=high)
return;
int left;
int right;
int pivot;
Stack S;
S.base=new int[24];
//log2 3000 ≈ 24
S.top=0;
S.base[S.top++]=high;
S.base[S.top++]=low;
while(S.top)
{
left=S.base[--S.top];
right=S.base[--S.top];
pivot=Get_pivotloc(L,left,right);
//Get_pivotloc函数得到每次支点的最终位置
if(pivot+1
{
S.base[S.top++]=right;
S.base[S.top++]=pivot+1;
}
if(left
{
S.base[S.top++]=pivot-1;
S.base[S.top++]=left;
}
}
}
void QuickSort(SqList &L,int low,int high)
//递归的快速排序
{
if(low
{
int pivot=Get_pivotloc(L,low,high);
QuickSort(L,low,pivot-1);
QuickSort(L,pivot+1,high);
}
}
本人每次的实验数据:排序6组,3000个元素
现在本人有两个问题:
①本人分别用递归的排序和非递归的排序来排序几乎一样的随机数据,但是递归总比非递归要快,但是快的不多,9秒左右。为什么同样都是堆栈的过程,递归的堆栈就快,本人本人写的堆栈过程就慢?是本人的优化不够还是有其他因素影响?
②本人再排序一组初态顺序的数据,发现在非递归排序中,当本人这组元素有3000个时,本人只需要给栈分配3个空间
S.base=new int[3];
本人分析,执行后,发现确实可以。但是快速排序的空间复杂度不是O(log2 n)吗?这个空间复杂度是指栈的空间还是指其他的?
这两个问题触及到了本人的知识盲区…
虽然没有要求这么做
但是本人比较好奇,想知道一下…
本人想问一下各位有思路或是答案吗?