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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2014, 22:25   #1
MyLifeStyle
Пользователь
 
Регистрация: 29.04.2014
Сообщений: 25
Восклицание Перевод сортировки

Добрый вечер. Помогите перевести корректно кусок кода на c++.

Реализация сортировки двухпутевыми вставками.

Код:
k:=(1+n) div 2; b[k]:=a[1];
left:=k; right:=k; m:=k;
for i:=2 to n do
if a[i]>b[m] then
    begin 
m:=(left+right+1) div 2;
if right=n then begin 
left :=left-(m-k); right:= right-(m-k); m:=k
          end;
right:=right+1;
      end 
else 
begin 
m:=(right+left-1) div 2;
if left=1 then begin 
left:=left+(k-m); right:=right+(k-m); m=k
     end;
left:=left-1
         end;
"right" - правая граница.
"left" - левая граница заполненной части массива "b".
"m" - номер элемента массива, который евляеться барьером.
На первом шаге "right", "left" и "m" равны "k" - адресу среднего элемента массива "a".
MyLifeStyle вне форума Ответить с цитированием
Старый 22.12.2014, 19:43   #2
MyLifeStyle
Пользователь
 
Регистрация: 29.04.2014
Сообщений: 25
По умолчанию

Вот пытался, но все равно не сортирует... Помогите

Код:
void sorrrt (int *arr, int size)
 
{
    int *b = new int [size];
    int k=size+1;
        b[k]=arr[1];     
    int left=k;
    int right=k;
    int m=k;
    for (int i=2; i<size; i++)
    {
 
        if 
            (arr[i]>b[m])
        {
            m=(left+right+1);
 
            if (right=size)
                {
                left=left-(m-k);
                right=right-(m-k);
                m=k;
                }
            right=right+1;
        }
 
        else 
        {
            m=(right+left-1);
                if (left=1)
                {
                left=left+(k-m);
                right=right+(k-m);
                m=k;    
                }
        left=left-1;
        }
    }
}
MyLifeStyle вне форума Ответить с цитированием
Старый 22.12.2014, 20:01   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Не уверен, что это то, что нужно но вот нашел в загашнике.
Код:
/*
Сортировка методом вставки:
 массив: 4312
 1. сортируются первые два элемента 3412
 2. затем 3-й вставляется алгоритмом на свою позицию: 1342
 3. и 4-й элемент: 1234
 4. и т.д.
 алгоритм сортировки:
*/
void SortInserting(double *array, int x)
{
  int m;
  double temp;
  for (int n = 1; n < x; n++)
  {
    m = n;
    while (m > 0 && array[m - 1] > array[m])
    {
      temp = array[m];
      array[m] = array[m - 1];
      array[m - 1] = temp;
      m--;
    }
  }
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.12.2014, 20:17   #4
MyLifeStyle
Пользователь
 
Регистрация: 29.04.2014
Сообщений: 25
По умолчанию

Нет. Мне надо 2хвставки
MyLifeStyle вне форума Ответить с цитированием
Старый 22.12.2014, 20:52   #5
MyLifeStyle
Пользователь
 
Регистрация: 29.04.2014
Сообщений: 25
Восклицание

Код:
void SortMas(int *arr,int *Sort_a, int size )
        {
            int s, w, left = size  - 1, right = size  - 1, t;
            Sort_a[size  - 1] = arr[0];
            for (w = 0; w < size ; w++)
            {
                t = arr[w];
                if (t >= arr[0]) 
                {
                    for (s = right; s >= 0 && t <  Sort_a[s] - 1; s--)
                    {
                         Sort_a[s + 1] =  Sort_a[s];
                    }
                    Sort_a[s + 1] = t;
                    
                    right++;
                }
                else
                {
                    for (s = left; s <= 2 * size  - 1 && t >  Sort_a[s]; s++)
                    {
                         Sort_a[s - 1] =  Sort_a[s];
                    }
                     Sort_a[s - 1] = t;
                
                    left--;
                }
            }
            for (s = left; s < left + size ; s++)
            {
                arr[s - left] = Sort_a[s];
            }       
        }
Вот что то получилось, но проблема в том, что работает раз через раз.
MyLifeStyle вне форума Ответить с цитированием
Старый 22.12.2014, 21:06   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вот этот сортирует:
Код:
// Сортировка методом двухпутевых вставок
void Tinsert (int *a, int n) 
{ 
  int *x,i,j, left=n-1, right=n-1,t;
  x=(int *) malloc((2*n-1)*sizeof(int));
  x[n-1]=a[0];
  for(i=1; i<n; i++)
  {
    t=a[i];
    if(t>=a[0])
    {
      for(j=right; j>=0&&t<x[j]; j--)
      x[j+1]=x[j];
      x[j+1]=t;
      right++;
    }
    else
    {
      for(j=left; j<=2*n-1&&t>x[j]; j++)
      x[j-1]=x[j];
      x[j-1]=t;
      left--;
    }
  }
  for(j=left; j<left+n; j++)
    a[j-left]=x[j];
  free(x);
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа, сортирующая исходный одномерный массив целых чисел методами пузырьковой сортировки и сортировки прямым выбором (язык С) igor01 Помощь студентам 7 16.05.2014 23:21
Сравнить эффективность алгоритмов шейкерной сортировки и сортировки слиянием (язык C) Ольга210993 Помощь студентам 2 20.09.2012 13:52
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
Сортировки в BP 7 ! wArRrrr Помощь студентам 2 07.10.2008 18:56