| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Поразрядная сортировка |
| Автор: CENTR 18.1.2006, 13:41 |
| Вообщем проблема с реализацией #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}; //инициализируем нулями. Как проще сделать я не знаю 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 | ||
|
| Автор: 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] должен иметь значение, равное сумме ВСЕХ элементов ДО данного |
| Автор: blackofe 19.1.2006, 19:23 | ||||
|
| Автор: blackofe 19.1.2006, 19:40 | ||||||||
не совсем понятно, что делает твой алгоритм, но данная конкретная проблема решается, ведь, совсем просто:
Добавлено @ 19:48
собственно то, что я и написал выше. ведь 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); } Выводит одни нули а должен: 0, 0, 0, 0, 1, 2, 2, 2, 5, 6 |
| Автор: blackofe 19.1.2006, 21:53 | ||||||
естественно. у тебя ведь цикл от второго элемента до последнего, а первый элемент - 0 (массив до этого места у нас выглядит как { 0, 0, 0, 0, 1, 1, 0, 3, 1, 1 }). соответственно во второй элемент попадает сумма предыдущих - 0. в третий - тоже 0 (сумма первого и обнуленного второго). и так далее. тебе надо цикл перевернуть - суммировать от последнего до первого (вернее, до второго - для первого тебе суммировать нечего). смотри:
результат:
еще. пользуйся, пожалуйста, тегами [ code ]. так код читать удобнее. |
| Автор: threef 19.1.2006, 22:01 | ||
Только ответ не может быть такой, как у тебя 0 0 0 0 1 2 3 9 16 32 UPS |
| Автор: blackofe 19.1.2006, 22:18 | ||||||||||
кстати, мне тут все-таки не совсем понятно.
но ведь не получается второй массив таким, как написано. берем 5-й элемент. все 4 предыдущих - нули. сумма - 0. значит, в результате должен получиться тоже 0. а там стоит 1. непонятно.. Добавлено @ 22:22
т.е. сам i-й элемент не должен включаться в сумму. а значит:
со всеми вытекающими предыдущими нулями в результате. |
| Автор: threef 23.1.2006, 19:25 |
| blackofe Ну...сфуфлил. Я ж сразу признал |