Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2011, 13:38   #1
JegorX
 
Регистрация: 15.11.2011
Сообщений: 5
Смущение Упорядочить нечетные элементы, оставив четные на местах

Здравствуйте

Прошу помощи в написании следующей программы:

В одномерном массиве упорядочить нечетные элементы, оставив четные на местах. Сортировка шейкерная.

Последней идеей было написание этой программы путём использования нескольких массивов, но у меня это не вышло(
JegorX вне форума Ответить с цитированием
Старый 22.11.2011, 13:49   #2
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Что подразумевается под "нечетными элементами"? Элементы под индексами 1,3,5... или что сами элементы нечетные?
Если первое - то все довольно просто, шаг цикла сделать равным 2
Если второе - то в доп массив записать нечетные элементы, отсортировать этот массив и потом по очереди заменять нечетные элементы исходного массива элементами второго (т.е. идем циклом по первому массиву, нашли нечетный элемент, в памяти увеличили отдельный счетчик на единицу, взяли из второго массива под этим индексом число и поменяли, и т.д.)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 22.11.2011, 13:55   #3
JegorX
 
Регистрация: 15.11.2011
Сообщений: 5
По умолчанию

Спасибо, вы конкретизировали мою идею по поводу нескольких массивов
Подразумевалось второе.

Буду пытаться технически это реализовать, однако учитывая нехватку опыта буду рад, если поможете мне в этом
JegorX вне форума Ответить с цитированием
Старый 22.11.2011, 14:07   #4
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

могу помочь всем кроме сортировки, шейкерную сходу не вспомню
кстати, язык какой?
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 22.11.2011, 14:17   #5
mill63
 
Регистрация: 22.11.2011
Сообщений: 5
По умолчанию

Zer0, помои , пожалуйста, решить задачу, очень срочно надо, вопрос жизни и смерти. Не знаю, как написать здесь в ЛС, поэтому вот мой емэйл

remzrazors@mail.ru

Очень прошу, отзовись
mill63 вне форума Ответить с цитированием
Старый 22.11.2011, 14:55   #6
JegorX
 
Регистрация: 15.11.2011
Сообщений: 5
По умолчанию

Язык Free paskal.
JegorX вне форума Ответить с цитированием
Старый 22.11.2011, 14:58   #7
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Кому интересно. Вот написал вариант сортировки нечётных элементов без дополнительного массива. В сортировке используються индекса предпоследнего и последнего найденного нечётного элемента (oddI1 и oddI2 соответсвенно). Подробно обьяснить весь алгоитм сейчас немогу. Но если будут конкретные вопросы могу ответить.
Код:
const maxN = 10;
var a:array[0..maxN-1] of integer;
    n:integer;
    oddI1,oddI2:integer;
    i:integer;
    swaped:boolean;
    sortAreaBegin:integer;
    sortAreaEnd:integer;
    temp:integer;
Begin
  n := maxN;
  randomize;
  for i := 0 to n-1 do
    a[i] := Random(10);
  for i := 0 to n-1 do
    write(a[i]:3,' ');
  writeln;
  
  sortAreaBegin := 0;
  sortAreaEnd := n - 1;
  oddI1 := -1;
  oddI2 := -1;
  repeat
    swaped := false;
    for i := sortAreaBegin to sortAreaEnd do Begin
      if (odd(A[i])) then Begin
        oddI1 := oddI2;
        oddI2 := i;
        if (oddI1>=0) then Begin
          if (A[oddI1]>A[oddI2]) then Begin
            temp := A[oddI1];
            A[oddI1] := A[oddI2];
            A[oddI2] := temp;
            swaped := true;
          end;
        end;
      end;
    end;
    if (not(swaped)) then break;
    oddI2 := oddI1;
    sortAreaEnd := oddI1-1;
    swaped := false;
    for i := sortAreaEnd downto sortAreaBegin do Begin
      if (odd(A[i])) then Begin
        oddI1 := oddI2;
        oddI2 := i;
{        if (oddI1>=0) then Begin } { Здесь это условие выполяеться всегда }
          if (A[oddI1]<A[oddI2]) then Begin
            temp := A[oddI1];
            A[oddI1] := A[oddI2];
            A[oddI2] := temp;
            swaped := true;
          end;
{        end;}
      end;
    end;
    oddI2 := oddI1;
    sortAreaBegin := oddI1+1;
  until not swaped;

  for i := 0 to n-1 do
    write(a[i]:3,' ');
  writeln;
End.
p.s. если будете использовать мой код. Погоняйте его много раз на разных данных. Я его несколько раз прогнал, вроде выдаёт правильный результат, но всёже я мог допустить гденибуть ошибку.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 22.11.2011 в 15:13.
val_nnm вне форума Ответить с цитированием
Старый 22.11.2011, 15:16   #8
JegorX
 
Регистрация: 15.11.2011
Сообщений: 5
По умолчанию

val_nnmо

Благодарю.

Ваш код даёт на выходе отсортированный массив в порядке уменьшения значения, но сортирует всё - и чётные и нечётные.

Тем не менее всё равно спасибо
JegorX вне форума Ответить с цитированием
Старый 22.11.2011, 15:54   #9
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Подправил.
Код:
const maxN = 10;
var a:array[0..maxN-1] of integer;
    n:integer;
    oddI1,oddI2:integer;
    i:integer;
    swaped:boolean;
    sortAreaBegin:integer;
    sortAreaEnd:integer;
    temp:integer;
Begin
  n := maxN;
  randomize;
  for i := 0 to n-1 do
    a[i] := Random(10);


  for i := 0 to n-1 do
    write(a[i]:3,' ');
  writeln;

  
  sortAreaEnd := n - 1;
  oddI2 := 0;
  { Находим первый нечётный элемент }
  while (oddI2<n) do Begin
    if (odd(A[oddI2])) then break;
    oddI2 := oddI2+1;
  end;
  oddI1 := -1;
  sortAreaBegin := oddI2; { Начинаем проход сортировать элементы с него }
  repeat
    swaped := false;
    for i := sortAreaBegin+1 to sortAreaEnd do Begin
      if (odd(A[i])) then Begin
        oddI1 := oddI2;
        oddI2 := i;
        if (A[oddI1]>A[oddI2]) then Begin
          temp := A[oddI1];
          A[oddI1] := A[oddI2];
          A[oddI2] := temp;
          swaped := true;
        end;
      end;
    end;
    if (not(swaped)) then break;
    oddI2 := oddI1;
    sortAreaEnd := oddI1;
    swaped := false;
    for i := sortAreaEnd-1 downto sortAreaBegin do Begin
      if (odd(A[i])) then Begin
        oddI1 := oddI2;
        oddI2 := i;
        if (A[oddI1]<A[oddI2]) then Begin
          temp := A[oddI1];
          A[oddI1] := A[oddI2];
          A[oddI2] := temp;
          swaped := true;
        end;
      end;
    end;
    oddI2 := oddI1;
    sortAreaBegin := oddI1;
  until not swaped;

  for i := 0 to n-1 do
    write(a[i]:3,' ');
  writeln;
End.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 22.11.2011 в 16:44.
val_nnm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поменять местами четные и нечетные по порядку следования слова LeonSun Общие вопросы C/C++ 2 08.06.2011 16:50
LISP.разделить список на 2, в первый поместить четные элементы исходного списка, во второй - нечетные mashik2503 Помощь студентам 1 17.05.2011 19:14
Нечетные элементы Кристинка89 Общие вопросы C/C++ 3 28.03.2011 02:52
четные и нечетные (delphi 7) STIFLER32 Помощь студентам 8 19.11.2009 17:24