2012-04-25 13 views
2

基本的なクイックソートアルゴリズムを実装しようとしましたが、正しく実装していると思います。しかし、関数は配列にはまったく影響しません。理由は何でしょうか?私はここに私の仲間のプログラマーに相談することを決定しましたので、間違っているかを把握できませんでした:C++:Void関数の影響を受けない変数

#include <iostream> 
#include <vector> 

using namespace std; 

int partition(vector<int> A,int low,int high) 
{ 
    int pivot=A[high-1]; 
    int boundryForLowerArray=low-1; 
    for(int i=low;i<high-2;i++) 
    { 
     if(A[i]<=pivot) 
     { 
      boundryForLowerArray++; 
      swap(A[i],A[boundryForLowerArray]); 
     } 
    } 
    swap(pivot,A[boundryForLowerArray+1]); 
    return boundryForLowerArray+1; 
} 
void quickSort(vector<int>A,int low,int high) 
{ 
    if(low<high) 
    { 
     int q=partition(A,low,high); 
     quickSort(A, low, q-1); 
     quickSort(A, q+1, high); 
    } 
} 


int main(int argc, const char * argv[]) 
{ 

    vector<int>A,sorted; 
    A.push_back(2); 
    A.push_back(8); 
    A.push_back(7); 
    A.push_back(1); 
    A.push_back(3); 
    A.push_back(5); 
    A.push_back(6); 
    A.push_back(4); 
    quickSort(A, 0, A.size()); 
    for(int i=0;i<A.size();i++) 
     cout<<A[i]<<" "; 
    return 0; 
} 
+0

+1完全なサンプルプログラムです。 –

+0

@Robᵩありがとうございます! – Ali

答えて

5

あなたはとてもquickSortはAのコピーを作成し、ソートされ、値ではなく、参照することによってAを渡していますそれ。代わりに、参照することによってベクトルを渡してみてください。

int partition(vector<int>& A,int low,int high) 

...と

void quickSort(vector<int>& A,int low,int high) 
+0

答えをありがとう。どうすればこの問題を解決できますか? – Ali

+0

@rolandbishop上記の2行を変更するだけです(つまり、 'ベクトル'を 'ベクトル 'に変更してください)、それは魅力的です。 –

+0

しかし、私はそれが私がlolをソートしないクイックソートアルゴリズムを書いたことに気付きました。 – Ali

0

あなたが参照することにより値でのparamsを通過しないので。実際には、配列の先頭と最後(vec.begin()、vec.end())のイテレータをパラメータとして持つ関数を用意する必要があります。さらに、アルゴリズムはあらゆる種類のイテレータを受け入れるべきです。だからあなたはテンプレートを使うべきです!

template<class Iterator> 
void quick_sort(Iterator begin, Iterator end) { 
    for(auto iter = begin;iter != end;iter++) 
     *iter; // access to the value of the iterator 
関連する問題