Технический форум

Технический форум (http://www.tehnari.ru/)
-   C/C++/С# (http://www.tehnari.ru/f42/)
-   -   Алгоритм перестановки элементов (http://www.tehnari.ru/f42/t95450/)

vitjok 27.03.2014 04:45

Алгоритм перестановки элементов
 
Вложений: 1
Здравствуйте. Кто нибудь подскажите алгоритм перестановки элементов таким образом:
дан вектор
исходный:
7894136
выходной:
6578941

перестановка производиться таким образом, что элемент в четной ячейке переходит в следующую четную,последняя четная в первую четную, а первая нечетная в сл нечетную, а последняя нечетная в первую.
Вложение 180909

Debianer 27.03.2014 11:12

Ну, вкратце так:
У нас, как я понимаю, вектор фиксированной длины. Начнем с нечетных ячеек.
Последнее значение запоминаем во временную переменную, потом предпоследнее нечетное двигаем на последнее место и т.д. Т.е. сдвиг делаем из конца в начало. Финальным этапом записываем число из переменной в первое нечетное.
Таким же макаром гоняем и четные :)
Еще один вариант - гонять попарно:
Значения двух последних ячеек сохраняем в две переменные, делаем сдвиг, как и в предыдущем случае, только каждое число сдвигаем на +2, и потом значения из переменных записываем в первые две ячейки. :)
Второй вариант прокатит с вектором любой длины; единственное, сначала надо будет определить, последняя ячейка четная или нет. Если да, то просто сдвигаем все, как я указал выше. Если нет - сдвигаем все числа, а переменные при записи меняем местами.
Например, последняя ячейка вектора у нас четная. Значение предпоследней ячейки пишем в А, последней - в В. После сдвига содержимое А идет в 1-ю ячейку, содержимое В - во 2-ю.
Если последняя ячейка нечетная, то содержимое А идет во 2-ю ячейку, содержимое В - в 1-ю.

vitjok 27.03.2014 16:46

код составил перестановка работает не совсем как должна, переставляем справа налево, а должна слева на право.
Код:

#include <stdio.h>
#include <conio.h>
#include <math.h>
//#include <time.h>

int main()
{
        int i, n,m, v_min, v_max,temp;

        time_t t;                // текущее время для инициализации
                                // генератора случайных чисел

        srand((unsigned) time(&t));        // инициализация генератора
                                                        // случайных чисел


        printf("\nZadanie 1");

        printf("\nEnter the range of random numbers:\n");
        printf("\nv_min=");
        scanf("%d", &v_min);
        printf("\nv_max=");
        scanf("%d", &v_max);
        printf("\nLength vektora:");
        scanf("%d", &n);

        int vector[n];

        printf("\nOriginal vector:\n");

        m = v_max-v_min + 1;

        for (i=0; i<n; i++)
                {
                                // получение случайного числа в диапазоне
                                // от vector_min  до  vector_max
                        vector[i]=rand()% m + v_min;
                        printf(" %5d", vector[i]);
                }

        printf("\n");



for (i = 1; i < n-1; i++)
            {
                if (i % 2 == 0)
                {
                    temp=vector[i+1];
                  vector[i+1]=vector[i-1];
                  vector[i-1]=temp;

                  }
            }
for (i = 0; i < n-1; i++)
            {
                if (i % 2 != 0)
                {
                    temp=vector[i+1];
                  vector[i+1]=vector[i-1];
                  vector[i-1]=temp;

                  }
            }

                        printf("\nObtained vector:\n");
                        for (i=0; i<n; i++)
                                {
                                        printf(" %5d", vector[i]);
                                }

        printf("\n");
        return 0;
}

кто может помочь исправить?


Часовой пояс GMT +4, время: 07:07.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.