7

次のコードがありますが、これは unsigned int でのみ機能し、私の目標はすべての int で機能するコードを作成することです...

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

これをすべての整数型で機能するように変更するにはどうすればよいですか?

4

2 に答える 2

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]a[i] - k_minます。残りは簡単なはずです。

于 2012-06-12T17:53:05.637 に答える
0

私の新しいコードは次のとおりです。

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]--; 
  }
}
于 2012-06-13T17:23:54.270 に答える