C++ C++;重复Pivot时的分区整数

C++ C++;重复Pivot时的分区整数,c++,quicksort,partitioning,C++,Quicksort,Partitioning,更新: 作为快速排序算法的一部分,我最初是要找到一个分区算法来对数组进行分区 例如一个数组,如: [5,3,2,4,3,1] 基于轴3,到 [小于3 | | 3,3,大于3] 最后发现不需要获取上面的分区,下面的结果也将使快速排序工作: [小于3 | | 3,大于或等于3] 这意味着3个不需要彼此相邻 下面是我的代码( int分区(std::vector&v,int pivot) { int左=0; int right=v.size()-1; while(左!=右) { 而(v[左]

更新:

作为快速排序算法的一部分,我最初是要找到一个分区算法来对数组进行分区

例如一个数组,如:

[5,3,2,4,3,1]

基于轴3,到

[小于3 | | 3,3,大于3]

最后发现不需要获取上面的分区,下面的结果也将使快速排序工作:

[小于3 | | 3,大于或等于3]

这意味着3个不需要彼此相邻

下面是我的代码(

int分区(std::vector&v,int pivot)
{
int左=0;
int right=v.size()-1;
while(左!=右)
{
而(v[左]<枢轴)+左;
而(枢轴
Ben注意到我应该用equal更新一个条件,这样一个条件就是“=”,这将使条件完整

但是,这个划分,

5,3,2,4,3,1

基于pivot 3,将是

<3 | 3,4,3,5

和三不是相邻的


真正好的事情是,实际上三个是否相邻并不重要。因为仔细考虑快速排序算法后,此分区将最终使数组排序。

将一个运算符更改为
尝试以下操作

#include <iostream>
#include <vector>
#include <utility>

std::vector<int>::size_type partition( std::vector<int> &v, int pivot )
{
    std::vector<int>::size_type i = 0, j = v.size();

    while ( i != j )
    {
        while ( i != j && v[i] < pivot ) i++;
        while ( i != j && !( v[--j] < pivot ) );
        if ( i != j ) std::swap( v[i++], v[j] );
    }

    return i;
}

int main() 
{
    std::vector<int> v = { 1, 4, 3, 5, 4, 6 };

    std::vector<int>::size_type n = partition( v, 4 );

    for ( std::vector<int>::size_type i = 0; i < n; i++ )
    {
        std::cout << v[i] << ' ';
    }
    std::cout << std::endl;

    for ( std::vector<int>::size_type i = n; i < v.size(); i++ )
    {
        std::cout << v[i] << ' ';
    }
    std::cout << std::endl;

    return 0;
}

Vlad,我需要输出为1 3 | 4 4 5 6,这可能吗?@证明它只是一个排序序列。在这种情况下,指定枢轴的意义是什么?H Vald,很抱歉这个例子。假设分区
3 4 1 6 4 5
将产生
3 1 | 4 6
,只要确保左侧较小,右侧较大,a与pivot相等的第二个数字在一起。谢谢!@Vindicate在这种情况下,您似乎需要将序列拆分为三个分区。我最终发现,对于快速排序算法,与pivot相等的数字不需要相邻。好吧,我应该提一下,我编写此分区是为了快速排序,以便您指出我的错误。以及您的错误分区代码很适合快速排序算法!嗨,本杰明,关于无中间地带的说法你是正确的,但是如果分区
143456
(基于4的轴)将产生
143456
,因为右光标将刚好经过“第二个4”在4的中间留下5个。也许我的代码将被重建来做分区,但是必须有一个方法来完成这个分区……正确。谢谢!嗨,本,等于枢轴的数字不需要与快速排序算法相邻。谢谢你指出改变一个操作符!
while (v[left] < pivot) ++left;
while (pivot <= v[right]) --right;
while ( compare(v[left], pivot) ) ++left;
while ( !compare(v[right], pivot) ) --right;
#include <iostream>
#include <vector>
#include <utility>

std::vector<int>::size_type partition( std::vector<int> &v, int pivot )
{
    std::vector<int>::size_type i = 0, j = v.size();

    while ( i != j )
    {
        while ( i != j && v[i] < pivot ) i++;
        while ( i != j && !( v[--j] < pivot ) );
        if ( i != j ) std::swap( v[i++], v[j] );
    }

    return i;
}

int main() 
{
    std::vector<int> v = { 1, 4, 3, 5, 4, 6 };

    std::vector<int>::size_type n = partition( v, 4 );

    for ( std::vector<int>::size_type i = 0; i < n; i++ )
    {
        std::cout << v[i] << ' ';
    }
    std::cout << std::endl;

    for ( std::vector<int>::size_type i = n; i < v.size(); i++ )
    {
        std::cout << v[i] << ' ';
    }
    std::cout << std::endl;

    return 0;
}
1 3 
4 5 4 6