本人用入栈出栈来模拟递归的过程,下面是栈的结构和递归代码和非递归:
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<right) { S.base[S.top++]=right; S.base[S.top++]=pivot+1; } if(left<pivot-1) { S.base[S.top++]=pivot-1; S.base[S.top++]=left; } } } void QuickSort(SqList &L,int low,int high) //递归的快速排序 { if(low<high) { 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)吗?这个空间复杂度是指栈的空间还是指其他的?
这两个问题触及到了本人的知识盲区…
虽然没有要求这么做
但是本人比较好奇,想知道一下…
本人想问一下各位有思路或是答案吗?
解决方案
40
栈的空间加上其他的空间
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!