сортировка с учетом реализации

#c #sorting

#c #сортировка

Вопрос:

вот код для подсчета сортировки

 #include <iostream>
using namespace std;

int main(){
    int a[]={2,3,1,2,3};
    int n=sizeof(int)/sizeof(int);
    int max=a[0];
    for (int i=1;i<n;i  ) {
        if (a[i]>max) { 
            max=a[i];
        }
    }

    int *output=new int[n];
    for (int i=0;i<n;i  ) {
        output[i]=0;
    }
    int *temp=new int[max 1];
    for (int i=0;i<max 1;i  ) {
        temp[i]=0;
    }
    for (int i=0;i<n;i  ){
        temp[a[i]]=temp[a[i]] 1;
    }
    for (int i=1;i<max 1;i  ) {
        temp[i]=temp[i] temp[i-1];
    }
    for (int  i=n-1;i>=0;i--) {
        output[temp[a[i]]-1]=a[i];
        temp[a[i]]=temp[a[i]]-1;
    }
    for (int i=0;i<n;i  ) {
        cout<<output[i]<<"  ";
    }
    return 0;
}
  

но вывод всего 2, только одно число. что не так, я не могу понять, пожалуйста, ребята, помогите мне

Комментарии:

1. Какой беспорядок. Я отформатировал ваш код для вас.

2. Почему бы не удалить массивы при выходе?

3. int n=sizeof(int)/sizeof(int); должно быть int n = sizeof(a) / sizeof(*a);

Ответ №1:

 int n=sizeof(int)/sizeof(int);
  

неверно. Это просто присваивает 1 n .

Вы имеете в виду

 int n=sizeof(a)/sizeof(int);
  

Я не смотрел дальше этого. Без сомнения, есть и другие проблемы, но это самая значительная.

Это то, что вы можете очень легко решить с помощью отладчика.

Комментарии:

1. … или даже с несколькими разумно размещенными операторами печати.

2. @Greg Их даже не нужно размещать так разумно !! 😉

3.Я думаю, вы должны предложить const int n=sizeof(a)/sizeof(int) вместо этого 🙂

4. Давайте научимся быть в безопасности, пока не узнаем, как не облажаться (о, а затем все равно сохраните хорошую привычку и получите прибыль от полной оптимизации). Это избавляет от анализа 50 строк компактного кода, чтобы увидеть, не записано ли что-то случайно в n .

Ответ №2:

Посмотрите на это выражение:

 int n=sizeof(int)/sizeof(int);
  

Как вы думаете, какова ценность n после этого? (1)
Это подходящее значение? (нет, значение должно быть равно 5)
Объясняет ли это результат, который вы видите? (да, это объясняет, почему отображается только одно число)

Комментарии:

1. @user466534, большую озабоченность вызывает то, что вы не смогли отладить это самостоятельно. Это указывает на то, что вы не просматриваете свой код в отладчике и не смогли найти вопросы и ответы, которые привели бы вас к правильному ответу. Все делают опечатки. Хорошие программисты обладают навыками диагностики опечаток.

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

Ответ №3:

Мой совет заключается в том, что если вы собираетесь делать это на C , вы на самом деле пытаетесь использовать то, что доступно на C , чтобы сделать это. Я бы посмотрел std::max_element , чтобы найти самый большой элемент во входных данных, и использовал std::vector вместо того, чтобы напрямую связываться с динамическим распределением.

Если вам нужно количество элементов в массиве на C , вы можете рассмотреть шаблон функции примерно так:

 template <class T, size_t N>
size_t num_elements(T const (amp;x)[N]) { 
    return N;
}
  

Вместо того, чтобы сбрасывать все в main , я бы также написал подсчет сортировки как отдельную функцию (или, лучше, шаблон функции, но я пока оставлю это в покое).

 // warning: Untested code:
void counting_sort(int *input, size_t num_elements) { 
    size_t max = *std::max_element(input, input num_elements);

    // allocate space for the counts.
    // automatically initializes contents to 0
    std::vector<size_t> counts(max 1); 

    // do the counting sort itself.
    for (int i=0; i<num_elements; i  )
          counts[input[i]];  

    // write out the result.
    for (int i=0; i<counts.size(); i  )
        // also consider `std::fill_n` here.
        for (int j=0; j<counts[i]; j  )
            std::cout << i << "t";
}

int main() { 
    int a[]={2,3,1,2,3};

    counting_sort(a, num_elements(a));
    return 0;
}