送分+求教=你看到的这个帖子.

redleaves 2001-12-05 08:39:24
小弟我写了几个排序算法.用不同的编译器编译出结果都不一样.

int QSort(long * Start,long * End)
{
if (Start>=End)
return 0;
long * lStart=Start,* lEnd=End,Mid=*Start;
while (lStart<lEnd)
{
while(lStart<lEnd&&*lEnd>=Mid) lEnd--;
*lStart=*lEnd;
*lEnd=Mid;
while(lStart<lEnd&&*lStart<=Mid) lStart++;
*lEnd=*lStart;
*lStart=Mid;
}
QSort(Start,--lStart);
QSort(++++lStart,End);
return 1;
}

int QuickSort(long * Start,long * End)
{
if (Start>=End)
return 0;
long * lStart=Start,* lEnd=End,Mid=(*Start+*End)/2,temp;
while (lStart<lEnd)
{
if (*lStart>Mid&&Mid>=*lEnd)
{
temp=*lStart;
*lStart=*lEnd;
*lEnd=temp;
lStart++;
lEnd--;
}
else
{
if (*lStart<=Mid)
lStart++;
if (Mid<=*lEnd)
lEnd--;
}
}
if (lStart>lEnd)
{
lStart--;
lEnd++;
}
else
if (lStart==lEnd)
{
if (*lStart<Mid)
lEnd++;
else
lStart--;
}
if (Start<lStart)
QuickSort(Start,lStart);
if (lEnd<End)
QuickSort(lEnd,End);
return 1;
}

QSort是从书上抄的,QuickSort是我自己设计的.
可是在GCC 2.95.3-5 (cygwin)下QSort一直都很正确,QuickSort在有些情况下会出现内存(我想可能是堆栈)溢出.可是我用MS VC6.0或Intel C/C++ Compiler 5.0下编译出的结果刚好相反----QuickSort一直都很正确,QSort在有些情况下会出现内存溢出.我真是想破了脑袋也想不出为什么?还请高手指点!
不过直得自豪的是,我自己写的比书上的快很多,尤其是在数据中有很多重复时!:)
我想,如果把它们都改成非递归时可能还会快很多!
...全文
162 24 打赏 收藏 举报
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
夭夭 2002-04-22
我是来要分的,
  • 打赏
  • 举报
回复
redleaves 2002-04-22
?
  • 打赏
  • 举报
回复
gxgxfish0813 2001-12-15
不会
  • 打赏
  • 举报
回复
redleaves 2001-12-15
TO Solstice(大佛):
不知道你所说的那个Introspective Sorting算法是什么样的.有没有什么资料可以给我看看?
我的EMAIL:scu319hy@263.net
  • 打赏
  • 举报
回复
redleaves 2001-12-15
TO eastsun():
++++a这种语句的编译结果是不会出错的,只有像a+++b这种才会错.因为++++a不存在二义性
而a+++b是存在二义性的.
  • 打赏
  • 举报
回复
eastsun 2001-12-15
你的代码在不同的编译器结果应该是不一样的,应该改成通用的程序。

象++这种语句应该单独成为一行。QSort(++++lStart,End);就是问题语句。
  • 打赏
  • 举报
回复
陈硕 2001-12-15
http://www.cs.rpi.edu/~musser/
  • 打赏
  • 举报
回复
redleaves 2001-12-14
TO Solstice(大佛):
你说的好像有些地方不是很对吧.
因为据数学分析的结果QSort的平均时间复杂度在理论上已经达到最优(内部排序中),是O(n*log(n)).在所有的O(n*log(n))的排序算法中它的系数是最小的.只是在有些特殊情况下它会蜕化为O(n*n).不过这种情况是可以通过改进算法避免的(我自己写的那个算法就避免了这种情况).
你所说的那种算法我不清楚,不过能达到O(n*log(n))的排序算法有很多.比如树形排序,堆排序,而且这两种排序都是在所有情况下的时间复杂度均一定为O(n*log(n))的.
对于改成递归后它能快多少,我不清楚.不过它的确是能快很多.以前我写过一个码制转换的程序.在改成非递归后快了近十倍.
关于我的程序缩进的问题,我也没有办法.CSDN不支持TAB.

TO kinghawk(雪鹰):
编译器不同所造成的编译结果不同是正常的.不过这种情况一般只会出现C/C++标准中没有定义到的地方,如编译后存储结构.而对于同种算法的描述,只要不用到这些特殊的部份,应该不会发生这种情况.我现在所遇到的情况是我从开始写程序到现在10多年中头一次遇到的.只恨自己不了解VC和GCC编译器的内部结构.
  • 打赏
  • 举报
回复
陈硕 2001-12-14

改成非递归并不会快多少,SGI STL的sort()就是用递归写的。

你这种“最普通”的快速排序,只能练练手,没有什么实用价值。

据我所知,目前最好的排序算法是Musser在1997年提出的Introspective Sorting,可以在几乎所有情况下做到O(n*log(n))。

你的程序没有缩进,没法看。
  • 打赏
  • 举报
回复
陈硕 2001-12-14
SGI STL中的sort()就是用 Introspective Sorting 加 递归 实现的,有不少优化措施,我没有全看懂。

introsort与quicksort的平均性能相当,但在最不利的情况下,前者也不会蜕化为O(n*n),所以STL才选用introsort。
  • 打赏
  • 举报
回复
kinghawk 2001-12-14
编译器不同,编译结果不同是正常的,特别是VC,有时同一个程序用debug和release模式编译出的结果都不同。
虽然将递归转化为非递归可以提高一定的速度,但是对于你的精力和时间来说,是不是划得来就看你自己了!
  • 打赏
  • 举报
回复
redleaves 2001-12-13
为什么每次我提的问题都没有人能帮我解决呢?
  • 打赏
  • 举报
回复
fiddleman 2001-12-13
搞吾懂~~~~~~ :(((
  • 打赏
  • 举报
回复
meng_tenboy 2001-12-13
感兴趣
  • 打赏
  • 举报
回复
redleaves 2001-12-13
TO chulizhi(楚立志):
发什么给你?我的编译器吗?我只是考虑编译器不同的原因,因为我对我的程序的正确性很有自信.
这里谢过你的好意.
  • 打赏
  • 举报
回复
j_md 2001-12-13
这个问题我也想问呀!!可怜的无心红叶!!
  • 打赏
  • 举报
回复
chulizhi 2001-12-13
我是有兴趣看,不过现在没有时间,如果你着的有诚意,就发邮件到chulizh@163.com
再见
  • 打赏
  • 举报
回复
redleaves 2001-12-12
不是吧!
给150分也没有人来看?
就当是散分吧!想要分的就留个名吧!
  • 打赏
  • 举报
回复
jhhxxdj 2001-12-10
那你就用你觉得正确的编译器编译好了
  • 打赏
  • 举报
回复
redleaves 2001-12-10
没有人感兴趣么?
没有人要分么?
唉!
.......
.......
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
申请成为版主
帖子事件
创建了帖子
2001-12-05 08:39
社区公告
暂无公告