日记2021.11.6

星期六

排、对于快速排序的思考
通过洛谷刷题我找到了一套快排模板,它比左神的那套更简洁,不需要将顺序打乱,它从中间开始向左右两边递归,但有一点,我调试了半天才看出来;

对于中间值,是在一开始赋值的时候就把中间值mid固定下来,而并不是表示中间值的下标
      			  int mid = arr[(L + R) / 2];
举个例子,如果说在某个qSort中,中间值比范围里所有的值都小,那首先,i不会动,j会径直往前等于中间
值然后,中间值会被扔到最前面,i来到中间值的下一个,而接下来的比较也会是和扔到最前面的那个中间值进
行,而不是和处于中间位置的新值,因为中间值右边的所有值都大于它,所以i还是不动,j径直来到中间值的
位置,然后退出这个循环,这个循环成功的将中间那个最小值放在了最左端,满足了任务;

在这里插入图片描述

在这里插入图片描述

而对于常规的数组的分析:在中间值的左边寻找第一个比中间值大的值,在中间值的右边寻找最后一个比中间
值小的值,它俩交换并且让它俩往中间再挪一个位置,因为原本的那两个数已经小的在左大的在右了;
如果i和j没有相互越过,则继续;
最理想的情况就是i和j同时到达中间,然后i和j再往两边挪一个位置,退出循环进行下次递归;
但一般情况是有一个先到达中间位置,比如j吧,当j到达中间位置时,它不大于mid,所以j会留在中间位置,
而i不可能超过中间位置,所以mid必定要和i进行交换,它为什么能交换:因为i对应的值比mid大,必须交换
交换之后,其实只保证了交换过来的那个值,也就是现在在中间位置的那个值左边比它小(起码对于处理过的
值而言),右边比它大;
(从交换这里就可以知道mid要设置为中间位置的值的原因了,中间值是不能换的,一个递归里只能有一个中
间值)
而如果在左边区域还有比交换过来的中间值大的值,诶,它俩交换,又保证了中间位置的值左小右大

(就是说怎么着都有道理呗)

Guess you like

Origin blog.csdn.net/dgytjhe/article/details/121185108