题:
设有一组初始记录关键字序列(K1,K2,…,Kn),要求设计一个算法能够在O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于Ki,右半部分的每个关键字均大于等于Ki。
代码:
void quickpass(int r[], int s, int t)
{
int i = s, j = t, x = r[s];
while (i < j) {
while (i<j && r[j]>x)
j = j - 1; //如果右边的元素大于基准元素就往前移
if (i < j) //直到上面循环结束,那么右边j此时是小于基准元素的,就与左边指向的元素进行交换
{ r[i] = r[j]; i = i + 1; }
while (i < j && r[i] < x)//如果左边元素小于基准元素,则i++
i = i + 1;
if (i < j) //直到此时左边元素大于基准元素,则与右边元素交换
{ r[j] = r[i]; j = j - 1; }
}
r[i] = x;//将循环结束后的之间位置赋给基准元素
}