Vannden Buendia Ответов: 1

Не могу сортировать более 2-значных чисел radix sort C++


программа может сортировать числа 0-9, но не может правильно сортировать, когда 10 выше вовлечены

Что я уже пробовал:

#include <iostream>
#include <math.h>
using namespace std;


int main() {
 int sa,temp1=0,largestnum=0,digits=0,digitvalue,temp2=0,divs=1,locator,reset,switcher=0,nset=1,singledigit;
 int value,testvalue,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,c0=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0,s8=0,s9=0,s0=0;
   cout<<"Enter size of array: ";cin>>sa;
    int array2[sa]={};
    int array3[sa]={};
    int q0[sa]={};
    int q1[sa]={};
    int q2[sa]={};
    int q3[sa]={};
    int q4[sa]={};
    int q5[sa]={};
    int q6[sa]={};
    int q7[sa]={};
    int q8[sa]={};
    int q9[sa]={};
   for(int i=0;i<sa;i++){
    cout<<"Enter value of array "<<i<<":";cin>>temp1;
    array2[i]=temp1;
    array3[i]=0;
   }
    cout<<"The values of the array are :";
    for(int i=0;i<sa;i++){

    cout<<array2[i]<<"|";
    }
    for(int i=0;i<sa;i++){
        if(i==0){largestnum=array2[i];}
        else{temp1=array2[i];
                if(temp1>largestnum){largestnum=temp1;}
        }
    }
    while(largestnum>9){
            largestnum=largestnum/10;
            digits=digits+1;
    }
    digits=digits+1;



    for(int i=1;digits>0;i*10){
            divs=i;

           for(int placement=0;placement<sa;placement++)
            {
                testvalue=array2[placement];
                if(testvalue<10){
                                    if(i==1){digitvalue=testvalue;}
                                    else{digitvalue=0;}
                }
                else if(testvalue>=10){digitvalue=(testvalue/divs)%10;}

                if(digitvalue==0){q0[c0]=testvalue;c0=c0+1;}
                else if(digitvalue==1){q1[c1]=testvalue;c1=c1+1;}
                else if(digitvalue==2){q2[c2]=testvalue;c2=c2+1;}
                else if(digitvalue==3){q3[c3]=testvalue;c3=c3+1;}
                else if(digitvalue==4){q4[c4]=testvalue;c4=c4+1;}
                else if(digitvalue==5){q5[c5]=testvalue;c5=c5+1;}
                else if(digitvalue==6){q6[c6]=testvalue;c6=c6+1;}
                else if(digitvalue==7){q7[c7]=testvalue;c7=c7+1;}
                else if(digitvalue==8){q8[c8]=testvalue;c8=c8+1;}
                else if(digitvalue==9){q9[c9]=testvalue;c9=c9+1;}
            }
            for(int show=0;show<sa;show++)
                {
                  if(c0>=1){array3[show]=q0[s0];c0=c0-1;q0[s0]=0;s0=s0+1;}
                  else if(c1>=1){array3[show]=q1[s1];c1=c1-1;q1[s1]=0;s1=s1+1;}
                  else if(c2>=1){array3[show]=q2[s2];c2=c2-1;q2[s2]=0;s2+=s2+1;}
                  else if(c3>=1){array3[show]=q3[s3];c3=c3-1;q3[s3]=0;s3+=s3+1;}
                  else if(c4>=1){array3[show]=q4[s4];c4=c4-1;q4[s4]=0;s4+=s4+1;}
                  else if(c5>=1){array3[show]=q5[s5];c5=c5-1;q5[s5]=0;s5+=s5+1;}
                  else if(c6>=1){array3[show]=q6[s6];c6=c6-1;q6[s6]=0;s6+=s6+1;}
                  else if(c7>=1){array3[show]=q7[s7];c7=c7-1;q7[s7]=0;s7+=s7+1;}
                  else if(c8>=1){array3[show]=q8[s8];c8=c8-1;q8[s8]=0;s8+=s8+1;}
                  else if(c9>=1){array3[show]=q9[s9];c9=c9-1;q9[s9]=0;s9+=s9+1;}
                }
                c1=0;c2=0;c3=0;c4=0;c5=0;c6=0;c7=0;c8=0;c9=0;c0=0;
                s1=0,s2=0;s3=0;s4=0;s5=0;s6=0;s7=0;s8=0;s9=0;s0=0;
                cout<<"\n"<<"Set "<<nset<<"\n";
                nset=nset+1;
                for(int output=0;output<sa;output++){
                cout<<array3[output]<<"|";
                array2[output]=array3[output];

                }

                digits=digits-1;
    }




   return 0;
}

Richard MacCutchan

Просто используйте простую операцию сравнения, чтобы найти, какое число меньше другого. Это будет работать для любой ценности.

Patrice T

Сортировка по радиксу подразумевает особую обработку.
Сортировка по радиксу - Википедия[^]

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
программа может сортировать числа 0-9, но не может правильно сортировать, когда 10 выше вовлечены

Это хорошая идея, чтобы показать пример ввода и вывода, которые терпят неудачу, это поможет помощникам понять, что происходит не так.

Ваш код выглядит слишком сложным для простой сортировки по радиксу, даже трудно понять, что происходит. Говорят, что для сортировки по радиусу требуется 2 копии массива, а не двенадцать копий.
Сортировка по радиксу - Википедия[^]
Я думаю, вам нужно еще больше изучить концепцию массива.
-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Не упаковывайте вещи в одну строку кода, это делает его более трудным для чтения без каких-либо преимуществ.
#include <iostream>
#include <math.h>
using namespace std;


int main() {
    int sa,temp1=0,largestnum=0,digits=0,digitvalue,temp2=0,divs=1,locator,reset,switcher=0,nset=1,singledigit;
    int value,testvalue,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,c0=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0,s8=0,s9=0,s0=0;
    cout<<"Enter size of array: ";
    cin>>sa;

    int array2[sa]={};
    int array3[sa]={};
    int q0[sa]={};
    int q1[sa]={};
    int q2[sa]={};
    int q3[sa]={};
    int q4[sa]={};
    int q5[sa]={};
    int q6[sa]={};
    int q7[sa]={};
    int q8[sa]={};
    int q9[sa]={};
    for(int i=0;i<sa;i++){
        cout<<"Enter value of array "<<i<<":";
        cin>>temp1;
        array2[i]=temp1;
        array3[i]=0;
    }
    cout<<"The values of the array are :";
    for(int i=0;i<sa;i++){
        cout<<array2[i]<<"|";
    }
    for(int i=0;i<sa;i++){
        if(i==0){
            largestnum=array2[i];
        }
        else{
            temp1=array2[i];
            if(temp1>largestnum){
                largestnum=temp1;
            }
        }
    }
    while(largestnum>9){
        largestnum=largestnum/10;
        digits=digits+1;
    }
    digits=digits+1;

    for(int i=1;digits>0;i*10){
        divs=i;

        for(int placement=0;placement<sa;placement++)
        {
            testvalue=array2[placement];
            if(testvalue<10){
                if(i==1){
                    digitvalue=testvalue;
                }
                else{
                    digitvalue=0;
                }
            }
            else if(testvalue>=10){
                digitvalue=(testvalue/divs)%10;
            }

            if(digitvalue==0){
                q0[c0]=testvalue;
                c0=c0+1;
            }
            else if(digitvalue==1){
                q1[c1]=testvalue;
                c1=c1+1;
            }
            else if(digitvalue==2){
                q2[c2]=testvalue;
                c2=c2+1;
            }
            else if(digitvalue==3){
                q3[c3]=testvalue;
                c3=c3+1;
            }
            else if(digitvalue==4){
                q4[c4]=testvalue;
                c4=c4+1;
            }
            else if(digitvalue==5){
                q5[c5]=testvalue;
                c5=c5+1;
            }
            else if(digitvalue==6){
                q6[c6]=testvalue;
                c6=c6+1;
            }
            else if(digitvalue==7){
                q7[c7]=testvalue;
                c7=c7+1;
            }
            else if(digitvalue==8){
                q8[c8]=testvalue;
                c8=c8+1;
            }
            else if(digitvalue==9){
                q9[c9]=testvalue;
                c9=c9+1;
            }
        }
        for(int show=0;show<sa;show++)
        {
            if(c0>=1){
                array3[show]=q0[s0];
                c0=c0-1;
                q0[s0]=0;
                s0=s0+1;
            }
            else if(c1>=1){
                array3[show]=q1[s1];
                c1=c1-1;
                q1[s1]=0;
                s1=s1+1;
            }
            else if(c2>=1){
                array3[show]=q2[s2];
                c2=c2-1;
                q2[s2]=0;
                s2+=s2+1;
            }
            else if(c3>=1){
                array3[show]=q3[s3];
                c3=c3-1;
                q3[s3]=0;
                s3+=s3+1;
            }
            else if(c4>=1){
                array3[show]=q4[s4];
                c4=c4-1;
                q4[s4]=0;
                s4+=s4+1;
            }
            else if(c5>=1){
                array3[show]=q5[s5];
                c5=c5-1;
                q5[s5]=0;
                s5+=s5+1;
            }
            else if(c6>=1){
                array3[show]=q6[s6];
                c6=c6-1;
                q6[s6]=0;
                s6+=s6+1;
            }
            else if(c7>=1){
                array3[show]=q7[s7];
                c7=c7-1;
                q7[s7]=0;
                s7+=s7+1;
            }
            else if(c8>=1){
                array3[show]=q8[s8];
                c8=c8-1;
                q8[s8]=0;
                s8+=s8+1;
            }
            else if(c9>=1){
                array3[show]=q9[s9];
                c9=c9-1;
                q9[s9]=0;
                s9+=s9+1;
            }
        }
        c1=0;c2=0;c3=0;c4=0;c5=0;c6=0;c7=0;c8=0;c9=0;c0=0;
        s1=0,s2=0;s3=0;s4=0;s5=0;s6=0;s7=0;s8=0;s9=0;s0=0;
        cout<<"\n"<<"Set "<<nset<<"\n";
        nset=nset+1;
        for(int output=0;output<sa;output++){
            cout<<array3[output]<<"|";
            array2[output]=array3[output];
        }
        digits=digits-1;
    }
    return 0;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
-----
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.