实验与结果:
将arr[i]<v和arr[j]>v:
while(i<=r && arr[i]<v) i++; while(j>=l+1 && arr[j]>v) j--;
改为arr[i]<=v和arr[j]>=v:
while(i<=r && arr[i]<=v) i++; while(j>=l+1 && arr[j]>=v) j--;
testSort就会运行100s+,也就是说,多了个等号的判断也会造成两棵子树不平衡
讨论:
比如数组 1,0,0, ..., 0, 0
a. 对于arr[i]<v和arr[j]>v的方式,第一次partition得到的分点是数组中间;
b. 对于arr[i]<=v和arr[j]>=v的方式,第一次partition得到的分点是数组的倒数第二个。
这是因为对于连续出现相等的情况,a方式会交换i和j的值;而b方式则会将连续出现的这些值归为其中一方,使得两棵子树不平衡
不知道我的理解是否恰当