快速排序的疑问

weibz0525 2003-09-17 01:07:29
钱能的<<C++教程>>中有一段快速排序的算法例子,但发现此程序有一定缺陷。
并不能完全排序,但偶找不到其中原因。猜想可能是如果中间值和高或者低值2者或者3者相同时出现的问题。哪位大虾帮忙抽空看看。
数组是一个2维n*3的,转换一维的,做比较的是第3个值,也是n*3+2

int tMiddle,l,r,temp,i;
l=tLeft;
r=tRight;
tMiddle=p[(tRight+tLeft)/2*3+2];
while(l<r)
{
while(p[l*3+2]<tMiddle)
++l;
while(p[r*3+2]>tMiddle)
--r;
if(l>=r)break;
i=p[l*3+2];
p[l*3+2]=p[r*3+2];
p[r*3+2]=i;
i=p[l*3+1];
p[l*3+1]=p[r*3+1];
p[r*3+1]=i;
i=p[l*3];
p[l*3]=p[r*3];
p[r*3]=i;
--r;
++l;

}
if(l==r)++l;
if(tLeft<r)
paixu1(p,tLeft,l-1);
if(tRight>l)
paixu1(p,r+1,tRight);*/
...全文
55 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
thornbird512 2003-09-24
  • 打赏
  • 举报
回复
在l==r的时候必须判断p[l]是否小等于tMiddle,如果小等于,则++l,
否则要--r,不做分支判断有可能会出现不完全排序的情况。具体原因
我不解释了,自己想想就知道了。

钱能这个算法思路上不是太好,而且书中的算法错误很多,国内作者写
书实在是不够严谨。

if(l==r)++l;
改为
if(l==r)
{
if(p[l] <= tMiddle) ++l
else --r;
}
weibz0525 2003-09-21
  • 打赏
  • 举报
回复
那些值的替换当然不用看了,
看关键的地方,关键值是[n][3]的数组的第[n][2]个值,用指针就是[n*3+2]了,其他都不用管的
BlueSky2008 2003-09-21
  • 打赏
  • 举报
回复
钱能书上那个例子是错的。别用那个了。
看这里
http://expert.csdn.net/Expert/topic/2237/2237721.xml?temp=.9200098
http://expert.csdn.net/Expert/TopicView1.asp?id=2059607
ZhangYv 2003-09-20
  • 打赏
  • 举报
回复
不知道,我看见那些下标很复杂又加又乘的很麻烦,懒的看!有时候难得胡涂,有时候不求甚解~ :)
eaglezy 2003-09-19
  • 打赏
  • 举报
回复
观程序而查错者,下策也。快速排序就是两块,一块划分,一块递归,这样不是很清楚吗?
weibz0525 2003-09-19
  • 打赏
  • 举报
回复
不是我想钻牛角尖,是他真的不对。
一维二维无所谓,我拿其他的快速排序算法作过实验,这种二维转一维的没问题。
但就这个算法有点问题,大致都能排序,但有些就排的不对。所以说这个bug难以琢磨呢,就在于此。
frankzch 2003-09-18
  • 打赏
  • 举报
回复
没看出问题
ZhangYv 2003-09-18
  • 打赏
  • 举报
回复
程序的风格太乱了,其实能真正把快速排序的 一维的 搞懂就已经很不容易了;我觉得没有必要钻牛角了
frankzch 2003-09-18
  • 打赏
  • 举报
回复
怎么没人来看?
还是我吃点苦吧,看看~~~~~~~~~~~
weibz0525 2003-09-18
  • 打赏
  • 举报
回复
我也没看出问题,但结果是不对的,但只是个几个不对,其他大部分是正确的。
排序的数组char[size][3],100<size<2000,对char[n][2]的大小为标准进行排序

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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