关于快速排序的问题qsort

o2jamwinds 2005-08-30 01:59:20
void qsort(int v[],int left,int right)
{
int i,last;
void swap(int v[],int i,int j);
if (left>=right) return;
swap(v,left,(left+right)/2); 问题1:为什么直接就交换left和(left+right)/2 ?
last=left;
for (i=left+1;i<=right;i++)
if (v[i]<v[left])
swap(v,++last,i); 问题2:++last 是先自增1再拿去使用的吧
swap(v,left,last); ++last和i 不是一样的吗?怎么还交换呢?
qsort(v,left,last-1);
qsort(v,last+1,right);
}

void swap(int v[],int i,int j)
{
int temp;
temp=v[i];
v[i]=v[j];
v[j]=temp;
}
...全文
163 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
o2jamwinds 2005-08-30
  • 打赏
  • 举报
回复
谢谢楼上的!
qhfu 2005-08-30
  • 打赏
  • 举报
回复
v[1]和v[1]交换就是不交换咯 呵呵! 但是至少这里达到一个目的就是:
v[1],小与 v[left],就是last进一格。
快速排序算法,并不只有这种比较方法。 也可以从两个方向往中间找。
o2jamwinds 2005-08-30
  • 打赏
  • 举报
回复
last=left;
for (i=left+1;i<=right;i++)
if (v[i]<v[left])
swap(v,++last,i);

例如第一次 left和 last都为0,进入for后,i为1.
那么if判断就是if(v[1]<v[0])
swap(v,++last,i)中 ++last为1,i也为1.那就是swap(v,1,1) ?即v[1]和v[1]交换?
xpchen_326 2005-08-30
  • 打赏
  • 举报
回复
严蔚敏版数据结构上说得很清楚。楼上的讲的很正确。“++last和i 不是一样的吗?怎么还交换呢?”有if (v[i]<v[left])条件的。
qhfu 2005-08-30
  • 打赏
  • 举报
回复
问题1:为什么直接就交换left和(left+right)/2 ?
这里是选择一个数做比较,在快速排序中选择方法很多,在这个地方,他是选择中间那个数做比较,不交换也可以就是选择第一个数作比较。好一点的是用随机选择的方式。

问题2:++last 是先自增1再拿去使用的吧
swap(v,++last,i);
这个目的是把满足if (v[i]<v[left])条件的放到last前面,要注意: last在for循环里面并不是每次都++的,只有当满足 上述条件时才做++,,也就能做到,在last前面的数都小于left

69,371

社区成员

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

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