C语言快速排序递归部分的代码我不是很懂,求解,思考了很久!!

开心小学徒 2017-10-20 04:05:53
下面是快速排序的代码:
void quick_sort(int s[], int l, int r)

{

if (l < r)

{

//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1

int i = l, j = r, x = s[l];

while (i < j)

{

while(i < j && s[j] >= x) // 从右向左找第一个小于x的数

j--;

if(i < j)

s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}



看完这段代码后对最后的quick_sort(s, l, i - 1); 和quick_sort(s, i + 1, r);我表示不能理解,第一个递归执行后返回,然后执行第二个递归,可是第一个递归执行完后改变i的值后,第二个递归是不是使用了第一个递归改变后的i值?还是两个递归使用的i值是一样的?不懂?
...全文
269 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
自信男孩 2017-10-20
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
递归是不断在栈上创建本身的函数栈,比如第一执行i = 5;那么i - 1,那么下次是4, 3, 2, 1,最后i = 1,然后当i为1时,然后执行quick_sort(s, i + 1, r); i+1, ... 根据栈的特性,之前创建的函数栈会逐步出栈,直到执行完(也就是所有的数据都完成排序); 函数并不是执行完一次就退出,回调是在新的栈上开辟新的(本身)函数栈空间
回调改成递归,用词不当
自信男孩 2017-10-20
  • 打赏
  • 举报
回复
递归是不断在栈上创建本身的函数栈,比如第一执行i = 5;那么i - 1,那么下次是4, 3, 2, 1,最后i = 1,然后当i为1时,然后执行quick_sort(s, i + 1, r); i+1, ... 根据栈的特性,之前创建的函数栈会逐步出栈,直到执行完(也就是所有的数据都完成排序); 函数并不是执行完一次就退出,回调是在新的栈上开辟新的(本身)函数栈空间
赵4老师 2017-10-20
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/
大尾巴猫 2017-10-20
  • 打赏
  • 举报
回复
当然是同一个值,i没变,递归函数传递的是值,又没传引用。

69,374

社区成员

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

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