Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Поразрядная сортировка


Автор: CENTR 18.1.2006, 13:41
Вообщем проблема с реализацией 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 вообще мне нужно расположить эл. мсассива в порядке возр\убыв.

Автор: SergeCpp 18.1.2006, 13:50
Заведи переменную для суммы и на каждом проходе цикла добавляй (в конце) текущее count.

Автор: Romikgy 18.1.2006, 14:02
Код

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

Автор: CENTR 19.1.2006, 13:10
хм...
так:
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

Автор: blackofe 19.1.2006, 19:23
Цитата(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));

Автор: blackofe 19.1.2006, 19:40
Цитата(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.

Автор: CENTR 19.1.2006, 20:53
Пробуем:

#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

Автор: blackofe 19.1.2006, 21:53
Цитата(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 ]. так код читать удобнее.

Автор: threef 19.1.2006, 22:01
Код


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

Автор: blackofe 19.1.2006, 22:18
Цитата(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];


со всеми вытекающими предыдущими нулями в результате.

Автор: threef 23.1.2006, 19:25
blackofe
Ну...сфуфлил. Я ж сразу признал

Автор: Dov 24.1.2006, 21:28
Так то же как-то не очень... возникает вопрос: зачем пересчитывать каждый раз то, что уже было однажды посчитано.
Цитата(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];    
    }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)