LINUX.ORG.RU

Ответ на: комментарий от Keiko

В алгоритме? ;)

А если по делу? Нужна просто реализация алгоритма.

anonymous
()

(на бумажке) строишь функцию преобразования индекса 
то есть зависимость итогого индекса j от исходного i;

идёшь циклом, 1-ый элемент идёт на последнее место 
берешь десятку(она в конце), пишешь туда 1-цу;
смотришь куда её поставить 10-ку,
берешь то число пишешь на его место 10ку,
и так далее, пока не переберешь все..

MKuznetsov ★★★★★
()

Из K&R

#include <string.h> /* reverse: переворачивает строку s (результат в s) */ void reverse(char s[]) { int с, i, j; for (i = 0, j = strlen(s)-1; i < j; i++, j--) { с = s[i]; s[i] = s[j]; s[j] = c; } }

stassats ★★★★
()
Ответ на: комментарий от stassats

#include <string.h>
/* reverse: переворачивает строку s (результат в s) */
void reverse(char s[])
{
    int с, i, j;
    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        с = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

stassats ★★★★
()

примерно так бы сделал:
/*Пусть А - искомый массив размера n*/
int *p = (A+n/2)   /*n будем считать чётным*/
int tmp;
for(i=1; i < n; i++)
{
(i%2)?p+=i:p-=i;
tmp = *(A+i);     /* Как вариант можно написать*/
*(A+i) = *p;      /* *(A+i)^=*p^=*(A+i)^=*p    */
*p = tmp;         /* но это уже выпендрёж =)   */
}

З.Ы. 
Писал сходу, ибо опаздываю в инст

Laz ★★★★★
()

=) Знаю такой алгоритм

int * VASYA_PUPKIN_A_L_G_O_R_I_T_M (int * arr)
{
    static int res_arr[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1 };

    for (int i=0; i<N; i++)  if ( arr[i] != i+1 ) return NULL;
   
    return res_arr;
}

BottleHunter
()
Ответ на: комментарий от MKuznetsov

Вот я и никак не могу допереть, как описать это с помощью алгоритма :( И что делать с затирающимися элементами :( Я не могу правильно организовать буфер.

kaktyc ★★★★
()
Ответ на: комментарий от kaktyc

я ж Вам ответил уже..возможно не слишком внятно - вы уж простите, 3 часа ночи было :-) там получается буфер размером в один(1) байт. то есть перед записью числа в позицию j, сначала считываем из неё число, которое будет используется на следующей итерации

MKuznetsov ★★★★★
()

#!/usr/bin/python

s=range(1,11)
print s
for y in range(10,0,-1):
    for x in range(y/2):
        tmp = s[x]
        s[x] = s[y-1-x]
        s[y-1-x] = tmp

print s

:)

kosmonavt
()

Всем огромное спасибо! Разобрался =)

P.S. Топик был мой, куки в браузере почистил :-P

kaktyc ★★★★
()
Ответ на: комментарий от kaktyc

Вот еще решение:

#include <stdio.h>
#include <stdlib.h>

int arr[]={1,2,3,4,5,6,7,8,9,10};
#define ALEN   (sizeof(arr)/sizeof(*arr))

int index_from_value(int value)
{
   int x = value - 1;
   return ( ALEN/2 > x)
          ? ((ALEN/2 - 1 - x)*2 + 1)
          : (x*2 - ALEN);
}

int fcmp(const void* px, const void* py)
{
    int ix = index_from_value(*(int*)px);
    int iy = index_from_value(*(int*)py);
    return ix-iy;
}

void print_arr(void)
{
   int i;

   printf("[");
   for(i=0; i<ALEN; i++)
       printf(i==ALEN-1 ? "%d]\n" : "%d, ", arr[i]);
}

int main()
{
   print_arr();
   qsort(arr,ALEN,sizeof(*arr),fcmp);
   print_arr();

   return 0;
}

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.