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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2010, 10:23   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
Восклицание Как отсортировать массив Double с максимум в середине списка?

Добрый день!

Как быстро отсортировать массив Double с максимум в середине списка?

Например, есть некий массив:

Код:
somearray : array[0..9] of Double = (10.56, 12.08, 12.08, 8.74, 16.19, 10.56, 11.03, 11.03, 7.45, 8.74);
Нужно получить следующий вид:

Код:
somearray : array[0..9] of Double = (7.45, 8.74, 10.56, 11.03, 12.08, 16.19, 12.08, 11.03, 10.56, 8.74);
Спасибо за любую идею.
SkAndrew вне форума Ответить с цитированием
Старый 12.02.2010, 10:38   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. рассортировать как обычно (по возрастанию)
2. отсортированный массив расставить как надо
максимальный в центр n/2
следующие два по бокам n/2-1 n/2+1
далее по списку

2. делим отсортированный массив на два: четные индексы в один, нечетные в другой
3. записываем первый
4. дописывем второй начиная с конца (чтобы шел по убыванию)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.02.2010 в 10:53.
evg_m вне форума Ответить с цитированием
Старый 12.02.2010, 16:30   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо, но у меня возникла проблема с записью значений из основного массива во временные (левый и правый). В чем проблема этого кода?

Код:
  private
    { Private declarations }
    SomeArray : array of Double;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(SomeArray, 10);
  SomeArray[0] := 10.56;
  SomeArray[1] := 12.08;
  SomeArray[2] := 12.08;
  SomeArray[3] := 8.74;
  SomeArray[4] := 16.19;
  SomeArray[5] := 10.56;
  SomeArray[6] := 11.03;
  SomeArray[7] := 11.03;
  SomeArray[8] := 7.45;
  SomeArray[9] := 8.74;
end;

procedure TForm1.Button1Click(Sender: TObject);
      var i : Integer;
          LeftArray : array of Double;
          RightArray : array of Double;
begin
  QuickSort(SomeArray); // стандартная быстрая сортировка
  for i := 0 to High(SomeArray) do
  begin
    if not Odd(i) then
    begin
      if i=0 then
        SetLength(LeftArray, 1)
      else
        SetLength(LeftArray, i-1);
      LeftArray[i] := SomeArray[i];
    end
    else
    begin
      if i=1 then
        SetLength(RightArray, 1)
      else
        SetLength(RightArray, i-1);
      RightArray[i] := SomeArray[i];
    end;
  end;
  SomeArray := nil;
  SetLength(SomeArray, 10);
  for i := 0 to High(SomeArray) do
    if i<=High(LeftArray) then
      SomeArray[i] := LeftArray[i]
    else
      SomeArray[i] := RightArray[i-High(SomeArray)];
  for i := 0 to High(SomeArray) do
    ListBox1.Items.Add(FloatToStr(SomeArray[i]));
end;
Выделенный код не работает, подскажите, пожалуйста, в чем причина, вроде смысл второго варианта претворил верно.
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 12.02.2010, 18:04   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
LeftArray[i div 2] := SomeArray[i];
RightArray[i div 2] := SomeArray[i];
лучше один раз перед циклом
Код:
 SetLength(RightArray, length(somearray) div 2 +1);//'это пример правильные значения надо уточнять для четных/нечетных длин исходного массива
Код:
for j:=0 to high(leftArray) do
  rezarray[j]"=leftarray[j];
left:=Length(leftArray);
right:=length(RightArray);
for j:=0 to high(rightarray) do
  rezarray[left+j]:=rightarry[right-j];
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.02.2010, 19:48   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за помощь.
SkAndrew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсортировать массив по убыванию в С++ sershok Помощь студентам 5 16.02.2009 00:31
как отсортировать массив под данный отрезок и как минимум и максимум из него найти SIEGER Паскаль, Turbo Pascal, PascalABC.NET 1 20.11.2008 08:58
Помогите отсортировать массив методом бинарных вставок zhorzh2407 Помощь студентам 1 19.11.2008 17:19
Символьный массив и double dima Общие вопросы C/C++ 5 15.12.2006 03:52