具体问题与if条件都在注释里,举个例子简述此题目
序号 1 2 3 4 5 6 7
数据 4 2 6 9 1 5 3
i代表左卫兵,j代表右卫兵,f代表哨兵的下标
由于哨兵会产生交换,所以要记录哨兵初始值flag
第一轮循环
i=4 j=7 f=4
交换后的
4 2 6 3 1 5 9
第二轮循环
i=7,j=6
不进行交换
此时i=right ,代表比flag小的数字已全都排序在左边
void quick(int a[], int left, int right) {
int temp;
int i = left, j = right, flag = a[(left + right) / 2];
while (i <= j) {
while (a[i] < flag)
i++;//找到比flag大的数,若小,则循环
while (a[j] > flag)
j--;//找到比flag小的数
if (i <= j) {//由于flag会被交换走,所以要设置这个条件,
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;//不写的话会让卫兵停在原地。
}
}
if (left < j)//如果left=j 代表最小值已排在了最左端
quick(a, left, j);
if (i < right)//如果right=i.代表最大的已经排在了最右端
quick(a, i, right);
}
if (left != j) //如果left=j 代表最小值已排在了最左端
quick(a, left, j);
if (i != right)//如果right=i.代表最大的已经排在了最右端
quick(a, i, right);
i ,j 不会超过 left 和 right
但这样会爆内存,目前不明白为什么