1. ホーム
  2. c++

[解決済み] c++ ベクトルバブルソート

2022-01-29 21:28:38

質問内容

g++ -std=c++11 Sort.cpp を使ってコンパイルしています。

私の問題は、バブルソートがソートされないことです。

多分、私はvectorを値で渡しているのでしょうが、私はc++で作業するのが初めてで、vectorライブラリを選択したので、よく分かりません。

私のコードは

#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;
}

mainの中でint型のベクター型を宣言し、リスト{3,2,6,1}を作成しています。

その後、関数 printVector を呼び出すと、コンソールにベクトルのすべての数が表示されます。 bubbleSort 関数を実行し、最後にもう一度表示します。

どのように解決するのですか?

参照渡しが必要 ;コピーを作ることによって、一時的なコピーをソートして、それで終わりです。それは消えて、オリジナルはまだソートされていない状態です、なぜなら、もう一度言います。 ベクトル全体の一時的なコピーをソートしたに過ぎません。

そこで変更 vector<int> avector<int>& 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;
}