1:输入一个整数数组,对其重新排序,将奇数放在数组前面,偶数放在后面。要求时间复杂度O(n), 空间复杂度O(1)。
void fun(int a[], int n)
{
if ((a == NULL) || n < 2)
{
return;
}
int p = 0;
int q = -1;
while (p < n)
{
if (a[p] & 1)
{
q++;
swap(a[p], a[q]);
}
p++;
}
}
2:在题目1基础上要求左右两部分分别有序。
int partition(int a[], int begin, int end)
{
int pivot = a[end];
if (pivot & 1)
{
int p = begin;
int q = begin-1;
while (p < end)
{
if ((a[p]&1) && (a[p] < pivot))
{
q++;
swap(a[p], a[q]);
}
p++;
}
swap(a[q+1], a[end]);
return q+1;
}
else
{
int p = end - 1;
int q = end + 1;
int label = -1;
while (p >= begin)
{
if (!(a[p]&1) && (a[p] > pivot))
{
q--;
swap(a[p], a[q]);
if (a[p] == pivot)
{
label = p;
}
}
p--;
}
if (label != -1)
{
swap(a[label], a[q-1]);
}
return q-1;
}
}
void arrange(int a[], int begin, int end)
{
if (begin < end)
{
int q = partition(a, begin, end);
arrange(a, begin, q-1);
arrange(a, q+1, end);
}
}