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

时间:2016-01-07 22:15:46

标签: 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 <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;
}

1 个答案:

答案 0 :(得分:3)

void swapit(vector<T> v, int i, int j) { ... }

这不会修改您传入的向量。而是为此函数创建一个副本。您可能想要使用引用:

void swapit(vector<T> & v, int i, int j) { ... }