2012-06-12 8 views
7

私はすべての整数型のために働くためにこれを変更するにはどうすればよいカウントソートを使用すると負の値になりますか?

void CountingSort(vector<int> & a, vector<int> & b) 
{ 
    int k=*max_element(a.begin(),a.end()); 
    k++; 

    vector <int> c(k); 

    for (int i=0;i<a.size();i++) 
     c[a[i]]++; 
    for (int i=1;i<k;i++) 
     c[i]=c[i]+c[i-1]; 
    for (int i=0;i<a.size();i++) 
    { 
     b[c[a[i]]-1]=a[i]; 
     c[a[i]]--; 
    } 
} 

...私は、コードを次しているが、これは、符号なし整数型でのみ動作し、私の目標は、すべてのint型のために働くだろうコードを記述するのですか?最小値と最大値を算出することにより

+0

あなたはあなたの入力( 'A')が空か、その場合はノーオペレーションではないことを主張しなければならないのいずれか。さもなければ、あなたが少なくともそれを期待するときあなたのプログラムをクラッシュさせます。 –

+0

実績のある作業アルゴリズムをそのままにして、入力と出力を変換することは、通常は良い考えです。それが学習目的でなければ、D –

答えて

6

スタート:

int k_min=*max_element(a.begin(),a.end()); 
int k_max=*min_element(a.begin(),a.end()); 
int k = k_max - k_min + 1; 

a[i] - k_minによってa[i]を置き換え、次のコードに変更を適用します。残りは容易でなければならない。私の新しいコードをAnatolyg

0

thnksは次のとおりです。

void Counting_Sort(vector <int>& a, vector <int>& b) 
{ 
int k=*max_element(a.begin(), a.end()); 
int m=*min_element(a.begin(), a.end()); 

    int n=k-m+1; 
    vector<int>v(n); 
for(int i=0; i<a.size(); i++) 
    v[a[i]-m]++; 
for(int i=1; i<v.size(); i++) 
    v[i]=v[i]+v[i-1]; 
    for(int i=a.size()-1;i>=0; i--) 
    { 
    b[v[a[i]-m]-1] = a[i]; 
    v[a[i]-m]--; 
    } 
} 
関連する問題