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