【问题标题】:c++ vector bubble sortC++ 向量冒泡排序
【发布时间】:2015-09-06 21:59:08
【问题描述】:

我使用 g++ -std=c++11 Sort.cpp 来编译我的文件。

我的问题是冒泡排序不排序。

也许我正在按值传递向量,但我不知道我是否是第一次尝试使用 c++,所以我选择了使用向量库。

我的代码是:

#include <iostream>
#include <vector>

using namespace std;

void bubbleSort(vector<int> a);

void printVector(vector<int> a);

int main(int argc, char const *argv[])
{
    vector<int> a{3,2,6,1};
    printVector(a);

    bubbleSort(a);
    printVector(a);
}

void bubbleSort(vector<int> a)
{
    bool swapp = true;
    while(swapp)
    {
        swapp = false;
        for (int i = 0; i < a.size()-1; i++)
        {
            if (a[i]>a[i+1] )
            {
                a[i] += a[i+1];
                a[i+1] = a[i] - a[i+1];
                a[i] -=a[i+1];
                swapp = true;
            }
        }
    }
}

void printVector(vector<int> a)
{
    for (int i=0;  i <a.size();  i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

我主要声明了一个 int 的向量类型并将列表设为 {3,2,6,1}

然后调用函数printVector,它假装在控制台上打印所有向量的数字并调用bubbleSort函数,最后再次打印。

【问题讨论】:

  • 通过引用传递向量:void bubbleSort(vector&lt;int&gt;&amp; a)
  • 旁白:如今,聪明的交换技巧弊大于利。

标签: c++ c++11 vector bubble-sort


【解决方案1】:

我也坚持了一段时间。 VermillionAzure 已经很好地回答了这个问题,但仍在粘贴我的解决方案。我不使用 std::swap 只是因为我喜欢手工操作。

#include <iostream>
#include <vector>

//function to swap values
//need to pass by reference to sort the original values and not just these copies
void Swap (int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void BubbleSort (std::vector<int> &array)
{
    std::cout<<"Elements in the array: "<<array.size()<<std::endl;

    //comparisons will be done n times
    for (int i = 0; i < array.size(); i++)
    {
        //compare elemet to the next element, and swap if condition is true
        for(int j = 0; j < array.size() - 1; j++)
        {   
            if (array[j] > array[j+1])
                Swap(&array[j], &array[j+1]);
        }
    }
}

//function to print the array
void PrintArray (std::vector<int> array)
{
    for (int i = 0; i < array.size(); i++)
        std::cout<<array[i]<<" ";
    std::cout<<std::endl;
}

int main()
{
    std::cout<<"Enter array to be sorted (-1 to end)\n";

    std::vector<int> array;
    int num = 0;
    while (num != -1)
    {
        std::cin>>num;
        if (num != -1)
            //add elements to the vector container
            array.push_back(num);
    }

    //sort the array
    BubbleSort(array);

    std::cout<<"Sorted array is as\n";
    PrintArray(array);

    return 0;
}

【讨论】:

    【解决方案2】:

    需要通过引用传递;通过制作副本,您可以对临时副本进行排序,然后就是这样;它消失了,而原始文件仍未排序,因为再次您只对整个向量的临时副本进行了排序。

    所以将vector&lt;int&gt; a 更改为vector&lt;int&gt;&amp; a

    这是代码,已修复:

    http://coliru.stacked-crooked.com/a/2f118555f585ccd5

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void bubbleSort(vector<int>& a);
    
    void printVector(vector<int> a);
    
    int main(int argc, char const *argv[])
    {
     vector<int> a {3,2,6,1};
    
     printVector(a);
    
     bubbleSort(a);
    
     printVector(a);
    
    
    
    }
    
    void bubbleSort(vector<int>& a)
    {
          bool swapp = true;
          while(swapp){
            swapp = false;
            for (size_t i = 0; i < a.size()-1; i++) {
                if (a[i]>a[i+1] ){
                    a[i] += a[i+1];
                    a[i+1] = a[i] - a[i+1];
                    a[i] -=a[i+1];
                    swapp = true;
                }
            }
        }
    }
    
    void printVector(vector<int> a){
        for (size_t i=0;  i <a.size();  i++) {
            cout<<a[i]<<" ";
    
        }
      cout<<endl;
    }
    

    【讨论】:

      【解决方案3】:

      您将向量作为值传递给您的函数,这意味着您正在排序一个副本,而不是原始向量,然后打印原始向量的副本。

      bubbleSort函数中将参数更改为vector&lt;int&gt; &amp;a,在printVector函数中更改为vector&lt;int&gt; const &amp;a(因为您不需要从这里更改矢量内容)。

      顺便说一句,您的代码可能会受到签名者整数溢出导致的未定义行为的影响。 您应该使用另一种方法来交换您的元素,例如std::swap

      std::swap(a[i], a[i + 1]);
      

      【讨论】:

      • 谢谢我不知道这个交换功能非常感谢
      猜你喜欢
      • 2013-03-27
      • 2014-03-26
      • 2018-11-13
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多