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

Vector elements are not swapped in partition algorithm.

本文关键字:交换 算法 分区 元素      更新时间:2023-10-16

问题来自《编程面试要素》(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;
}
void swapit(vector<T> v, int i, int j) { ... }

这不会修改您传入的向量。相反,它会为该函数创建一个副本。你可能想使用一个参考:

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