快速排序的关键操作在于分割,即以某个关键值为轴讲序列分割成比轴大和比轴小的两类。下面是由此引申的两个分类问题。
1.已有有一组整数,如何使得数组中奇数在偶数的前面。
这个问题的解法和快速排序的分割很相似,代码如下:
void do_parttion(int *pdata, int size)
{
int i, j;
i = 0;
j = size - 1;
while (j > i)
{
while (j > i && !pdata[j]%2)
{
j--;
}
while (j > i && pdata[i]%2)
{
i++;
}
int tmp;
tmp = pdata[i];
pdata[i] = pdata[j];
pdata[j] = tmp;
i++;
j--;
}
}
2、三色球问题: 有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右,依次是一些红球、一些白球、一些蓝球。
void do_parttion(int *pdata, int size)
{
int red, cur, blue;
red = cur = 0;
blue = size - 1;
while (cur <= blue)
{
if (pdata[cur] == RED)
{
swap(pdata, red, cur);
red++;
cur++;
}
else if (pdata[cur] == WHITE)
{
cur++;
}
else
{
swap(pdata, cur, blue);
blue--;
}
}
}