void qukliy_sort(int q[], int l, int r)
{
//递归结束条件
if (l == r)
{
return;
}
int x = q[l];
//因为在每次交换完两个数后,会让两个指针移动一下
int i = l - 1;
int j = r + 1;
//让小于的在前,大于的在右,让i在左端,j在右端
//如果q[i]在不满足<x时候,不让i向后移动了,如果满足q[i]<x的话就让i指向下一个,就是像后移动
//同理,q[j]不满足>x的时候,不让j向后移动了,如果满足>x的话,j向后移动一个
while (i < j)
{
do
{
i++;
}
while (q[i] < x);
do
{
j--;
} while (q[j] > x);
if (j > i)
{
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
//快排两侧的数据
qukliy_sort(q, l, j);
qukliy_sort(q, j+1, r);
}
int main() {
int q[] = { 3,6,2,5,1,4};
qukliy_sort(q,0,5);
for (int i = 0; i < 6; i++) {
printf("%d ", q[i]);
}
printf("\n");
return 0;
}
其实还是有注意事项的,当我们让x = q[l]的时候
这里就不能写成如下这种情况,因为可能发生边界问题,比如数组是1,2 ,
如果写成这样的话,x不能取到q[r],和上面一样的道理这里我就不再赘述
非要用q[r]的话
改写成这样就可以了
总结:所以我们不管用i还是j,为了防止临界问题让x = q[(l + r) / 2]就行了