快速排序的一个小问题没想明白,求助各位

卤猫大镖客 2014-05-26 06:28:35
void QuickSort(int a[],int left,int right)
{
if(left > right) return ;
int i = left, j = right, temp = a[left];
while(i != j)
{
while(i < j && a[j] >= temp) j--; //注意这两个while
while(i < j && a[i] <= temp) i++; //注意这两个while

if(i < j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

}
a[left] = a[i];
a[i] = temp;

QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}


我开始写的时候是先i++后j--,但是这样出来的结果不对,而先j--后i++就没问题,结果是对的,但是我不明白是为啥,谁能给说一下,谢谢
...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2014-05-30
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/19016.htm?from_id=2084344&type=syn&fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fr=aladdin#2
knate 2014-05-29
  • 打赏
  • 举报
回复
我也想知道.
逍遥子0426 2014-05-27
  • 打赏
  • 举报
回复
你两个while后赋值有问题 应该这样写: int Partition(int *ar,int left,int right) { int i = left,j = right; int tmp = ar[i]; while(i<j) { while(i<j && ar[j] >= tmp) --j; ar[i] = ar[j]; while(i<j && ar[i] <= tmp) ++i; ar[j] = ar[i]; } ar[i]=tmp; return i; } void QuickSort(int *ar,int left,int right) { if(right > left) { int index=Partition(ar,left,right); QuickSort(ar,left,index-1); QuickSort(ar,index+1,right); } }
赵4老师 2014-05-27
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
j8daxue 2014-05-27
  • 打赏
  • 举报
回复
支点是 a[left],即左边第一个数。 最终结果是:i左边的都比支点小,右边的比它大。 1.先--j,后++i,则因为++i时保证了i<j,故如果j<=i时,i不再变动。 2.反之,先++i,则可能因为if(i < j)不成立,于是下面swap不执行,导致i并不满足最终结果。 eg: 4 8 1 5 7 1. a).temp = 4, j = 2,i = 1, a[i] = 8, a[j] = 1; -> 4 1 8 5 7 b).j = 1, i = 1. ->结束 2. a).i = 1,j =2,a[i] = 8, a[j] = 1; -> 4 1 8 5 7 b).i = 2,j = 2; ->结束 这样交换的支点就不对了(8)
sdghchj 2014-05-27
  • 打赏
  • 举报
回复
因为:int i = left, j = right, temp = a[left]; 如果是int i = left, j = right, temp = a[right];你再试先i++再j--. 具体还得自己去琢磨。

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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