Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка подсчетом

45K
05 августа 2009 года
Eugenio
15 / / 26.07.2009
Здравствуйте, посоветуйте в доработке функции сортировки. Программа сортирует подсчетом целочисленный массив, но когда встречаются повторяющиеся числа то первое выводится правильно, а остальные выводятся в виде нулей. Заранее благодарен.

Код:
#include <stdio.h>


void sort_count(int in[],int out[],int n)
 { int i,j ,count;
      for (i=0; i< n; i++)
      {
      for ( count=0,j=0;j<n; j++)
         
           if (in[j] < in)
      count++; // Подсчитывает количество элеменов перед текущим
               out[count]=in; // Определяет его место в выходном массиве
 
             }
     
 }                                                

void main()
{
int a[]={41,7,8,40,8};// Входной массив
int b[5]={0}; // Выходной массив
int n=sizeof(a)/sizeof(int);
sort_count(a,b,n);
for (int i=0; i<n; i++)
printf("%d ",b);
puts("");
}
297
05 августа 2009 года
koodeer
1.2K / / 02.05.2009
Неужели нельзя приводить код в более читабельном виде? Скажем, так:
Код:
void sort_count(int in[], int out[], int n)
{
    int i, j, count;
    for (i=0; i<n; i++)
    {
        for (count=0, j=0; j<n; j++)
            if (in[j] < in)
                count++; // Подсчитывает количество элеменов перед текущим
        out[count] = in; // Определяет его место в выходном массиве
    }
}                                            

void main()
{
    int a[] = { 41, 7, 8, 40, 8}; // Входной массив
    int b[5] = { 0 }; // Выходной массив
    int n = sizeof(a)/sizeof(int);
    sort_count(a, b, n);
    for (int i=0; i<n; i++)
        printf("%d ",b);
    puts("");
}
Ибо нет никакого желания разбираться в хаосе плохоотформатированного кода.

Теперь по делу.
Анализ показывает, что повторяющиеся числа помещаются все в одно место. Соответствено, в целевом массиве остаются нули.
Перерабатывайте алгоритм, вводите дополнительные проверки.
12K
05 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: koodeer
Теперь по делу.
Анализ показывает, что повторяющиеся числа помещаются все в одно место. Соответствено, в целевом массиве остаются нули.
Перерабатывайте алгоритм, вводите дополнительные проверки.



Можно например так попробовать.
Вместо

 
Код:
if (in[j] < in)
                count++; // Подсчитывает количество элеменов перед текущим

сделать
 
Код:
if (in[j] < in || in[j] == in && j < i)
                count++; // Подсчитывает количество элеменов перед текущим

Правда не совсем красиво - усложнение условия...
341
06 августа 2009 года
Der Meister
874 / / 21.12.2007
Цитата: Ghox
Можно например так попробовать.
...
Правда не совсем красиво - усложнение условия...

В отдельный цикл можно:

 
Код:
{
    for (int j = 0; j < n; j++)
        if (in[j] < in)
            count++;
           
    for (int j = 0; j < i; j++)
        if (in[j] == in)
            count++;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог