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

Posted

技术标签:

【中文标题】向量元素在分区算法中不交换。【英文标题】:Vector elements are not swapped in partition algorithm. 【发布时间】:2016-01-07 22:15:45 【问题描述】:

问题来自《编程面试要素》(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;

【问题讨论】:

我认为你只需要在你的 swapit 函数中通过引用传递向量。 【参考方案1】:
void swapit(vector<T> v, int i, int j)  ... 

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

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

【讨论】:

以上是关于向量元素在分区算法中不交换。的主要内容,如果未能解决你的问题,请参考以下文章

计算机网络·通俗理解RIP协议(距离向量算法计算)

Day2:选择排序和两数相加

RIP协议与距离向量算法的简单总结

是否有任何标准算法可以对向量元素进行成对比较?

在迭代算法中使用 Rcpp 加速替换列表和向量的元素是不是合法?

:内存管理 -- 内存空间的扩充(覆盖技术交换技术)连续分配管理方式(单一连续分配(系统区/用户区)固定分区分配动态分区分配)动态分区分配算法