Code Bye

关于快速排序的非递归算法的时间复杂度和空间复杂度

本人用入栈出栈来模拟递归的过程,下面是栈的结构和递归代码和非递归:
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、指令流水线、多种存储介质、……满天飞的时代!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于快速排序的非递归算法的时间复杂度和空间复杂度