2012-06-12 17 views
7

मैं कोड निम्नलिखित है, लेकिन यह केवल अहस्ताक्षरित ints के लिए काम करता है और अपने लक्ष्य को एक कोड है जो सभी ints के लिए काम करेगा लिखने के लिए है ...नकारात्मक मूल्यों पर क्रमबद्ध गणना का उपयोग करना?

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

मैं कैसे बदल सकता हूँ यह सब अभिन्न प्रकार के लिए काम करने के लिए?

+0

आप या तो जोर होना चाहिए कि आपका आदानों ('A') खाली या नहीं सेशन ऐसा नहीं कर रहे हैं। अन्यथा जब आप कम से कम इसकी अपेक्षा करते हैं तो आप अपने प्रोग्राम को क्रैश करेंगे। –

+0

आम तौर पर इनपुट एल्गोरिदम को सक्रिय करने और इनपुट और आउटपुट को बदलने के लिए साबित करना एक अच्छा विचार है। जब तक यह सीखने और टिंकरिंग उद्देश्यों के लिए नहीं है: डी –

उत्तर

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] की जगह; बाकी आसान होना चाहिए।

0

thnks अपने नए कोड Anatolyg है:

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]--; 
    } 
} 
संबंधित मुद्दे