48 57 28 39 63 31 90 64 6 87
i j
x=48, i=0, j=length-1;
把他看成(48放入了x中):
57 28 39 63 31 90 64 6 87
i j
第一趟:
1.先从后往前找第一个比x小的数, j移到数值6的位置,然后把6填到下标为i的地方
6 57 28 39 63 31 90 64 87
i j
2.从前往后找第一个比x大的数,把他放到j处
6 28 39 63 31 90 64 57 87
i j
3.再从后往前:
6 31 28 39 63 90 64 57 87
i j
4.再从前往后:
6 31 28 39 63 90 64 57 87
i j
5.再从后往前,此时i==j,把x填到这个空缺处,结束。
6 31 28 39 48 63 90 64 57 87
i
j
之后再对48左边和右边做同样的操作。
代码:
void quick_sort(int data[], int left, int right)
{
if (data == NULL || left < 0 || right < 0)
{
return;
}
if (left < right)
{
int i = left;
int j = right;
int pivot = data[i];
while (i < j)
{
while (i < j && data[j] > pivot)
{
--j;
}
if (i < j)
{
data[i++] = data[j];
}
while (i < j && data[i] < pivot)
{
++i;
}
if (i < j)
{
data[j--] = data[i];
}
}
data[i] = pivot;
quick_sort(data,left,i-1);
quick_sort(data,i+1, right);
}
}