Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量元素在分区算法中不交换。_C++_Algorithm_Vector - Fatal编程技术网

C++ 矢量元素在分区算法中不交换。

C++ 矢量元素在分区算法中不交换。,c++,algorithm,vector,C++,Algorithm,Vector,问题来源于《编程访谈》一书(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 <typenam

问题来源于《编程访谈》一书(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;
}
#包括
#包括
使用名称空间std;
模板
虚空swapit(向量v,整数i,整数j)
{
温度;
温度=v[i];
v[i]=v[j];
v[j]=温度;
}
模板
void dutch_flag_分区(向量&v,int数据透视索引)
{
T pivot=v[数据透视索引];
整数下限=0;
int等于0;
int大于等于v.size()-1;
而(等于
void swapit(向量v,int i,int j){…}
这不会修改传入的向量。相反,它会为此函数创建一个副本。您可能希望使用引用:

void swapit(vector<T> & v, int i, int j) { ... }
void swapit(向量&v,inti,intj){…}

我认为您只需要在swapit函数中通过引用传递向量。非常感谢您,比尔!
void swapit(vector<T> & v, int i, int j) { ... }