Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поразрядная сортировка, сортировка чисел 
:(
    Опции темы
CENTR
  Дата 18.1.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Вообщем проблема с реализацией smile

#include <stdio.h>
int main()
{
int source[]= {7,9,8,5,4,7,7};// исходный массив
int n=7;
int count[10]={0,0,0,0,0,0,0,0,0,0}; //инициализируем нулями. Как проще сделать я не знаю smile
int i,c;
int dest[10]; //выходной массив
int k=0;

for( i=0; i<n; i++)
count [ source[i] ]++; //проходим исходный массив увеличивая count

count[i]=count[0]+count[i-1]; //тут необходимо "присвоить count[i] значение, равное сумме всех элементов до данного"

for ( i=0; i<n; i++ ) {
c = source[i];
dest[ count[c] ] = c;// выходной массив
count[c]++; // для повторяющихся чисел
}
while (k!=7){
printf ("%d",dest[k]);
k++;//вывод массива
}
return (0);
}
Cобственно проблема в этом - "count[i]=count[0]+count[i-1]" - дословно необходимо "присвоить count[i] значение, равное сумме всех элементов до данного" - а как это сделать?

p.s. возможны ошибки.
p.p.s. источник http://algolist.manual.ru/sort/radix_sort.php
p.p.p.s вообще мне нужно расположить эл. мсассива в порядке возр\убыв.
PM MAIL   Вверх
SergeCpp
Дата 18.1.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Заведи переменную для суммы и на каждом проходе цикла добавляй (в конце) текущее count.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 18.1.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Код

for( i=1; i<n; i++)
count[i]=count[i]+count[i-1];



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
CENTR
Дата 19.1.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



хм...
так:
for( i=1; i<n; i++)
count[i]=count[i]+count[i-1];
суммируются только 2 эл., а мне нужно реализовать такую цепочку:
count[i] = count[0]+count[1]+...count[i-1], т.е. count[i] должен иметь значение, равное сумме ВСЕХ элементов ДО данного smile
PM MAIL   Вверх
blackofe
Дата 19.1.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(CENTR @ 18.1.2006, 13:41)
int count[10]={0,0,0,0,0,0,0,0,0,0}; //инициализируем нулями. Как проще сделать я не знаю smile

Код

    int count[10];
    memset(count, 0, sizeof(count));

PM MAIL   Вверх
blackofe
Дата 19.1.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(CENTR @ 18.1.2006, 13:41)
count[i]=count[0]+count[i-1]; //тут необходимо "присвоить count[i] значение, равное сумме всех элементов до данного"

не совсем понятно, что делает твой алгоритм, но данная конкретная проблема решается, ведь, совсем просто:

Код

    count[i] = 0;               // инициализируем переменную суммы
    for(int j = 0; j < i; ++j)  // цикл по всем "элементам до данного"
        count[i] += count[j];   // прибавляем к сумме элемент

Добавлено @ 19:48
Цитата(CENTR @ 18.1.2006, 13:41)
p.p.s. источник http://algolist.manual.ru/sort/radix_sort.php

Цитата

Присвоить count[i] значение, равное сумме всех элементов до данного:
count[i] = count[0]+count[1]+...count[i-1].
В нашем примере count[] = { 0, 0, 0, 0, 1, 2, 2, 2, 5, 6 }
Эта сумма является количеством чисел исходного массива, меньших i.


собственно то, что я и написал выше. ведь count[0]+count[1]+...count[i-1] - ни что иное, как суммирование в цикле от 0 до i-1.

Это сообщение отредактировал(а) blackofe - 19.1.2006, 19:41
PM MAIL   Вверх
CENTR
Дата 19.1.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Пробуем:

#include <stdio.h>
int main()
{
int source[]= {7,9,8,5,4,7,7};
int n=7;
int count[]={0,0,0,0,0,0,0,0,0,0};
int i,j;
int k=0;

for( i=0; i<n; i++)
count[source[i]]++;

for( i=1; i<10; i++)
{
count[i] = 0;
for(j = 0; j < i; ++j)
count[i] += count[j];
}

while (k!=10){
printf ("%d",count[k]);
k++;
}
return (0);
}

Выводит одни нули smile
а должен: 0, 0, 0, 0, 1, 2, 2, 2, 5, 6

PM MAIL   Вверх
blackofe
Дата 19.1.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(CENTR @ 19.1.2006, 20:53)
Выводит одни нули smile
а должен:  0, 0, 0, 0, 1, 2, 2, 2, 5, 6

естественно. у тебя ведь цикл от второго элемента до последнего, а первый элемент - 0 (массив до этого места у нас выглядит как { 0, 0, 0, 0, 1, 1, 0, 3, 1, 1 }). соответственно во второй элемент попадает сумма предыдущих - 0. в третий - тоже 0 (сумма первого и обнуленного второго). и так далее.

тебе надо цикл перевернуть - суммировать от последнего до первого (вернее, до второго - для первого тебе суммировать нечего). смотри:

Код

int main() 
{
    int source[] = { 7, 9, 8, 5, 4, 7, 7 };
    int size_source = sizeof(source)/sizeof(source[0]);
    int count[10];
    memset(count, 0, sizeof(count));
    int size_count = sizeof(count)/sizeof(count[0]);

    for(int i = 0; i < size_source; ++i)
        count[source[i]]++;

    for(i = size_count-1; i >= 0; --i) {
        count[i] = 0;
        for(int j = 0; j < i; ++j) 
            count[i] += count[j];
    }

    for(i = 0; i < 10; ++i)
        cout << count[i] << ", ";
    cout << endl;

    return 0;
}


результат:

Код

0, 0, 0, 0, 0, 1, 2, 2, 5, 6,


еще. пользуйся, пожалуйста, тегами [ code ]. так код читать удобнее.

Это сообщение отредактировал(а) blackofe - 19.1.2006, 21:54
PM MAIL   Вверх
threef
Дата 19.1.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Код


int main() 
{
int source[]= {7,9,8,5,4,7,7};
int n=7;
int count[10]={0};// !
int i,j;
int k=0;

for( i=0; i<n; i++) 
count[source[i]]++;

for( i=1; i<10; i++)
{
int sum = 0; //!
for(j = 0; j <= i; ++j) 
sum += count[j];
count[i]=sum;
}

while (k<10){
printf ("%d\n",count[k]);
k++;
}
return (0);
}


Только ответ не может быть такой, как у тебя

0 0 0 0 1 2 3 9 16 32
UPS

Это сообщение отредактировал(а) threef - 19.1.2006, 22:05
PM MAIL   Вверх
blackofe
Дата 19.1.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(CENTR @ 18.1.2006, 13:41)
p.p.s. источник http://algolist.manual.ru/sort/radix_sort.php

кстати, мне тут все-таки не совсем понятно.

Цитата

Создать массив count из m элементов(счетчиков).
Присвоить count[i] количество элементов source, равных i. Для этого:
проинициализовать count[] нулями,
пройти по source от начала до конца, для каждого числа увеличивая элемент count с соответствующим номером.
for( i=0; i<n; i++)  count [ source[i] ]++

В нашем примере count[] = { 0, 0, 0, 0, 1, 1, 0, 3, 1, 1 }
Присвоить count[i] значение, равное сумме всех элементов до данного:
count[i] = count[0]+count[1]+...count[i-1].
В нашем примере count[] = { 0, 0, 0, 0, 1, 2, 2, 2, 5, 6 }
Эта сумма является количеством чисел исходного массива, меньших i.


но ведь не получается второй массив таким, как написано. берем 5-й элемент. все 4 предыдущих - нули. сумма - 0. значит, в результате должен получиться тоже 0. а там стоит 1. непонятно.. smile
Добавлено @ 22:22
Цитата

Присвоить count[i] значение, равное сумме всех элементов до данного:
count[i] = count[0]+count[1]+...count[i-1].


т.е. сам i-й элемент не должен включаться в сумму. а значит:

Цитата(threef @ 19.1.2006, 22:01)


Код
for(j = 0; j <= i; ++j) // должно быть j < i
sum += count[j];


со всеми вытекающими предыдущими нулями в результате.
PM MAIL   Вверх
threef
Дата 23.1.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



blackofe
Ну...сфуфлил. Я ж сразу признал

PM MAIL   Вверх
Dov
Дата 24.1.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Так то же как-то не очень... возникает вопрос: зачем пересчитывать каждый раз то, что уже было однажды посчитано.
Цитата(blackofe @ 19.1.2006, 21:53 Найти цитируемый пост)

Код
for(i = size_count-1; i >= 0; --i) {    
        count[i] = 0;    
        for(int j = 0; j < i; ++j)    
            count[i] += count[j];    
    }




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.