问题来自编程访谈元素(2012)。 问题6.1第53页:“编写一个将数组A(我使用向量)和索引i写入A的函数,并重新排列元素,使得所有小于A [i]的元素首先出现,然后是等于A的元素[ i],后跟大于A [i]的元素。你的算法应该有O(1)空间复杂度和O(| A |)时间复杂度。
我的代码对矢量没有任何作用。
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void swapit(vector<T> v, int i, int j)
{
T temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
template <typename T>
void dutch_flag_partition(vector<T> &v, int pivotindex)
{
T pivot = v[pivotindex];
int lower = 0;
int equals = 0;
int larger = v.size() - 1;
while(equals <= larger)
{
cout << equals << " " << larger<< endl;
if(v[equals] < pivot)
{
swapit(v, lower++, equals++);
}
else if(v[equals] == pivot)
{
++equals;
}
else
{
swapit(v, equals, larger--);
}
}
}
int main()
{
int arr[] = {1,11,3,5,3,10,0,22,50,33,4,22,23,100,9};
vector<int> v (arr, arr + sizeof(arr)/sizeof(arr[0]));
dutch_flag_partition(v, 5);
for(int i = 0; i < v.size(); ++i)
{
cout << v[i] << " ";
}
cout << endl;
return 0;
}
答案 0 :(得分:3)
void swapit(vector<T> v, int i, int j) { ... }
这不会修改您传入的向量。而是为此函数创建一个副本。您可能想要使用引用:
void swapit(vector<T> & v, int i, int j) { ... }