void quickSort(int *attr, int begin, int end)
{
int i,j;
if (begin >= end)/*不需要处理*/
{
return;
}
/* attr[begin]作为基准 */
i = begin + 1;
j = end;
/* 循环将比基准大的放后边 */
while (i < j)
{
if (attr[i] > attr[begin])
{
swap(&attr[i], &attr[j]);
j--;
}
else
{
i++;
}
}
/* 最后一个未处理的处于大小分界的数与基准值作对比,确定前后位置 */
/* 注意:必须带=号,例如{2,1,2},会一直进行(2>2)==0的比较陷入死循环 */
if (attr[i] >= attr[begin])
{
i--;
}
swap(&attr[i], &attr[begin]);
quickSort(attr, begin, i);
quickSort(attr, j, end);
}
上面实现了从小到大的排列方法,一次递归将比基准值小的放在前面,大的放后面(务必保证 [begin, i] 区间不能存在大于基准值的数)。在通常情况下,通过递归调用log n的深度即可完成排序。
以下是完整代码:
#include <stdio.h>
void swap(int *left, int * right)
{
int temp;
temp = *left;
*left = *right;
*right = temp;
}
void quickSort(int *attr, int begin, int end)
{
int i,j;
if (begin >= end)/*不需要处理*/
{
return;
}
/* attr[begin]作为基准 */
i = begin + 1;
j = end;
/* 循环将比基准大的放后边 */
while (i < j)
{
if (attr[i] > attr[begin])
{
swap(&attr[i], &attr[j]);
j--;
}
else
{
i++;
}
}
/* 最后一个未处理的处于大小分界的数与基准值作对比,确定前后位置 */
/* 注意:必须带=号,例如{2,1,2},会一直进行(2>2)==0的比较陷入死循环 */
if (attr[i] >= attr[begin])
{
i--;
}
swap(&attr[i], &attr[begin]);
quickSort(attr, begin, i);
quickSort(attr, j, end);
}
int main(int argc, char *argv[])
{
int a[5] = {5,2,8,4,1};
int i = 0;
quickSort(a, 0, 4);
for(; i<5; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
执行结果:
1 2 4 5 8