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

zkw261123 2017-03-31 10:31:20
我用入栈出栈来模拟递归的过程,下面是栈的结构和递归代码和非递归:

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)吗?这个空间复杂度是指栈的空间还是指其他的?

这两个问题触及到了我的知识盲区...
虽然没有要求这么做
但是我比较好奇,想知道一下...
我想问一下各位有思路或者是答案吗?
...全文
1771 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-05
  • 打赏
  • 举报
回复
栈的空间加上其他的空间 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
zkw261123 2017-04-05
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/
老师你可能会错我的意思了 我是想问 ①为什么快速排序的非递归算法会比递归算法还慢 ②快速排序的平均空间复杂度O(nlog2 n)是指栈的空间还是栈的空间加上其他的空间?
FancyMouse 2017-04-01
  • 打赏
  • 举报
回复
3000个数据会慢到9秒那已经看上去像平方复杂度了。估计哪里写扯了。 复杂度是指最坏复杂度。你一个特定的数据能做到更优并不奇怪。
赵4老师 2017-04-01
  • 打赏
  • 举报
回复
各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧