免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5269 | 回复: 14
打印 上一主题 下一主题

奇怪的Stack Overflow [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-15 16:26 |只看该作者 |倒序浏览
同样的数据,为什么第一次(无序)使用快排(递归)很正常
而接着再快排,就会Stack Overflow呢?
数据为一个6w多记录的数组,保存一个单链表的节点指针
数组和单链表都在堆上

同样的快排代码
对于int a[63537] = {1, 2, 3, 4, 5, ..., 63537}这样的数据
进行排序,为什么不论排几次都不会Statck Overflow?



实在受不了了,高手帮一把,快排的代码没有问题。

ps:每趟快排以第一个数据为基准

论坛徽章:
0
2 [报告]
发表于 2006-04-15 16:43 |只看该作者
对于1, {2, 3, 4, 5, 6, ..., 63539}
由于是有序的,每次都对{}中快排
第二趟2, {3, 4, 5, 6, ..., 63539}

如此循环往复,在9247的时候程序崩溃,调试发现Statck Overflow

论坛徽章:
0
3 [报告]
发表于 2006-04-15 16:56 |只看该作者
下班回家了,想出点头绪了,回到家接着讨论^_^

论坛徽章:
0
4 [报告]
发表于 2006-04-15 17:42 |只看该作者
对于无序的数据,平均来讲,第一趟快排后,可能将数据大体上分成了3w和3w两部分
然后对两个3w部分递归

有序后,变成对6w部分(我这里是右半部分)进行递归,所以可能对3w部分递归没问题
而对6w递归则会导致stack overflow

不过,这么解释的话,就与我试验的情况相悖了,也就是
对于a[] = {1, 2, 3, ..., 63539}进行快排,不会出现stack overflow

论坛徽章:
0
5 [报告]
发表于 2006-04-15 18:35 |只看该作者
LZ是在跟自己讨论吧? 要跟大家讨论请把代码贴出来, 你能保证你的代码没问题吗? 如果这样那你觉得什么地方可能出问题?

论坛徽章:
0
6 [报告]
发表于 2006-04-15 18:37 |只看该作者
追加一句,你的程序可能递归调用不当

论坛徽章:
0
7 [报告]
发表于 2006-04-15 19:02 |只看该作者
代码很长,截取部分估计。。。
大家看看吧

  1. typedef struct tagLinkRecord {
  2.         U16 Size;
  3.         U16 Len;
  4.         U32 LinkID;
  5.         U32 Node;
  6.         char* Name;
  7. }LinkRec, *pLinkRec;

  8. typedef struct tagLinkList {
  9.         pLinkRec pLR;
  10.         tagLinkList* next;
  11. }LinkList, *pLinkList;

  12. void QuickSort(pLinkList* pData, U32 left, U32 right)
  13. {
  14.         if(left >= right)
  15.                 return;
  16.         U32 i = left, j = right;
  17.         U32 LID = pData[left]->pLR->LinkID;
  18.         pLinkList pTemp = pData[left];

  19.         while(i < j) {
  20.                 while((pData[j]->pLR->LinkID >= LID) && (i < j))
  21.                         j--;
  22.                 pData[i] = pData[j];
  23.                 while((pData[i]->pLR->LinkID <= LID) && (i < j))
  24.                         i++;
  25.                 pData[j] = pData[i];
  26.         }
  27.         pData[i] = pTemp;
  28.         //完成一次

  29.         //每一边再快排
  30.         if(left < i - 1 && i != left)        //加上!=是为了防止i溢出
  31.                 QuickSort(pData, left, j - 1);
  32.         if(right > i + 1)
  33.                 QuickSort(pData, i + 1, right);
  34. }
复制代码


看看是不是ls说的递归调用不当导致的stack overflow,有意见尽管提
俺很虚心的说

论坛徽章:
0
8 [报告]
发表于 2006-04-15 19:09 |只看该作者
make程序时扩大程序“初始保留栈”的大小即可,如果程序本身没问题。

论坛徽章:
0
9 [报告]
发表于 2006-04-15 19:13 |只看该作者
你的quick sort对于有序序列退化了,O(n)的空间就栈溢出了

论坛徽章:
0
10 [报告]
发表于 2006-04-15 19:17 |只看该作者
to ls:
嗯嗯,我弄不准是不是这个问题,因为毕竟有成功的情况,程序其他部分没有大量
使用stack,并且我写过试验程序,没发现有stack overflow的情况,二者编译
时初始栈区是一样的
不过我还是44,谢了^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP