要求:空间复杂度O(1),时间复杂度为O(n)
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
const int size = sizeof array / sizeof *array;
void reform(int (&array)[size])
{
int i = 0, j = size - 1;
while(i <= j) {
while(i <= j) {
if(array[i] % 2 == 0)
break;
else
i++;
}
while(i <= j) {
if(array[j] % 2 != 0)
break;
else
j--;
}
//如果不在这里进行i++,j--就会出错
swap(array[i++], array[j--]);
}
}
void main()
{
reform(array);
copy(array, array + size, ostream_iterator<int>(cout, " "));
}
如果将i<=j作为判定条件,那么最后第二次swap就已经得到的正确结果,在再次进入循环之后swap回来出错。
错误结果:
运行上面代码,结果为:
将代码按标准的快速排序算法改写,既简洁且不容易出错。
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
const int size = sizeof array / sizeof *array;
void reform(int (&array)[size])
{
int i = 0, j = size - 1;
while(i < j) {
while(i < j && array[i] % 2 != 0) {
i++;
}
while(i < j && array[j] % 2 == 0) {
j--;
}
//如果不在这里进行i++,j--就会出错
swap(array[i], array[j]);
}
}
void main()
{
reform(array);
copy(array, array + size, ostream_iterator<int>(cout, " "));
}
这道题最难的地方在于 i<j 还是 i<=j 的判断上。