Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 9
1

Пирамидальная сортировка

10.06.2014, 21:04. Показов 3115. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята , может кто поможет , очень срочно уже надо в Delphi запилить
Вот задача :
Дан одномерный массив.Все положительные элементы расположить в порядке убывания,отрицательные-в порядке возрастания,нулевые оставить без изменения.Относительного расположения отрицательных и положительных элементов не менять.Использовать пирамидальную сортировку,реализовав метод в виде подпрограммы.

Ну очень уж буду признателен , плиз помогите!!!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2014, 21:04
Ответы с готовыми решениями:

Пирамидальная сортировка
Пытался сам написать код. Слишком сложно для меня. Так как начинаю только изучать Дел. Помогите с...

Пирамидальная сортировка
необходимо добавить сортировку методом пирамиды вот сюдаunit Unit1; interface uses Windows,...

Пирамидальная сортировка
Нужна помощь. Необходимо провести сортировку массива (8 рандомных элементов) методом пирамидальной...

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

11
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
10.06.2014, 21:14 2
Лучший ответ Сообщение было отмечено johnny_Oo как решение

Решение

Цитата Сообщение от johnny_Oo Посмотреть сообщение
Дан одномерный массив.Все положительные элементы расположить в порядке убывания,отрицательные-в порядке возрастания,нулевые оставить без изменения.Относительного расположения отрицательных и положительных элементов не менять.Использовать пирамидальную сортировку,реализовав метод в виде подпрограммы.
1)Запоминаем позиции отдельно отрицательных и отдельно положительных элементов(Лучше всего в два отдельных массива чисел). Выносим отрицательные и положительные элементы в отдельные массиве и там сортируем(думаю, как это сделать говорить не надо). Теперь расставляем по циклу отрицательные и положительные элементы на свои места(сначала отрицательные, затем положительные в те места, которые запомнили) после сортировки. Выводим весь массив. Элементы с нулем остаются не тронутыми. Очищаем память от всех использованных массивов, кроме основного.(Если эти массивы были не глобальными переменными, то Windows по завершению процедуры должна была их удалить из памяти).
2)Читаем здесь: http://ru.wikipedia.org/wiki/%... E%E2%EA%E0
1
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 9
10.06.2014, 21:20  [ТС] 3
Пробую
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
10.06.2014, 21:25 4
Цитата Сообщение от johnny_Oo Посмотреть сообщение
Пробую
Будут проблемы, пиши здесь. Форумчане помогут всегда товарищу.
0
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 9
10.06.2014, 21:28  [ТС] 5
Не могу найти толковой пирамидальной сортировки для Паскаля , это мрак вообще
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
10.06.2014, 21:33 6
Цитата Сообщение от johnny_Oo Посмотреть сообщение
Не могу найти толковой пирамидальной сортировки для Паскаля , это мрак вообще
Возьми C# или C, далее переводим в Delphi. Во многом они похожи.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
static void HeapSort(int[] a)
{
    int i;
    int temp;
 
    for (i = a.Length / 2 - 1; i >= 0; i--)
    {
        siftDown(a, i, a.Length);
    }
 
    for (i = a.Length - 1; i >= 1; i--)
    {
        temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        siftDown(a, 0, i);
    }
}
 
static void siftDown(int[] a, int i, int j)
{
    bool done = false;
    int maxChild;
    int temp;
 
    while ((i * 2 + 1 < j) && (!done))
    {
        if (i * 2 + 1 == j - 1)
            maxChild = i * 2 + 1; 
        else if (a[i * 2 + 1] > a[i * 2 + 2])
            maxChild = i * 2 + 1;
        else
            maxChild = i * 2 + 2;
 
        if (a[i] < a[maxChild])
        {
            temp = a[i];
            a[i] = a[maxChild];
            a[maxChild] = temp;
            i = maxChild;
        }
        else
        {
            done = true;
        }
    }
}
Добавлено через 1 минуту
На С:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void HeapSort(uint[] a)
 {
  int i;
  int temp;
  int len = a.length;
  for (i = len/ 2 - 1; i >= 0; i--)
   {
    ShiftDown(a, i, len);
   }
  for (i = len - 1; i > 0; i--)
   {
    temp = a[0];
    a[0] = a[i];
    a[i] = temp;
    ShiftDown(a, 0, i);
   }
 }
 
void ShiftDown(uint[] a, int i, int j)
 {
  uint temp;
  uint left = 2 * i + 1;
  uint right = left + 1;
  uint MaxChild = left;
  while (MaxChild < j)
   {
    if (right < j)
     {
      if (a[left] < a[right])
       {
        MaxChild = right;
       }
     }
    if (a[i] < a[MaxChild])
     {
      temp = a[i];
      a[i] = a[MaxChild];
      a[MaxChild] = temp;
     }
    else
     {
      break;
     }
    i = MaxChild;
    left = 2 * i + 1;
    right = left + 1;
    MaxChild = left;
   }
 }
0
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 9
10.06.2014, 21:34  [ТС] 7
Буду пробовать , дело в том что C я вообще не знаю , я первый год учусь
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
10.06.2014, 21:39 8
Цитата Сообщение от johnny_Oo Посмотреть сообщение
Буду пробовать , дело в том что C я вообще не знаю , я первый год учусь
Я тоже сильно не разбираюсь в C и C#, но постараюсь хоть что-то перевести(Написать описание процедур, тут они используются, расставить begin и end, условия, циклы, переменные).
0
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 9
10.06.2014, 22:39  [ТС] 9
ай , ничего не получается
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
11.06.2014, 10:41 10
Тут описываются две процедуры:
Delphi
1
2
Procedure HeapSort(a: array of Integer);
Procedure ShiftDown(a: array of Integer; i,j: integer);
В процедурах(С) используются цыклы for и While. Почитав немного описание можно понять:
For можно заменить на For Down To.
А While использовать можно как While Do.
Короче вот переведенный из википедии код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Procedure HeadSort(var a: array of Integer);
var
i,temp,len: Integer;
//Описываем локальную процедуру, подробнее читайте в книге Библия Delphi
procedure ShiftDown(var a: array of Integer; var i,j: integer);
var
Left,Right,MaxChild,temp: Integer; //по идеи так
begin
left:=2*i+1;
right:=left+1;
MaxChild:=left;
While MaxChild < j Do 
begin
if Right < j then
begin
if a[left] < a[right] then MaxChild:=right;
if a[i]<a[MaxChild] then 
begin
temp:=a[i];
a[i]:=a[MaxChild];
a[MaxChild]:=temp;
end;
end
else break;
i:=MaxChild;
left:=2*i+1;
right:=left+1;
MaxChild:=left;
end;
end;
begin
len:=Length(a);
For i:=Round(len/2)-1 Downto 0 do 
ShiftDown(a,i,len);
 
for i:=len-1 DownTo 1 Do 
begin
temp:=a[0];
a[0]:=a[i];
a[i]:=temp;
ShiftDown(a,0,i);
end;
end;
Добавлено через 1 минуту
Интересно, то что перевел я.
0
9 / 5 / 4
Регистрация: 11.12.2016
Сообщений: 166
27.05.2017, 14:48 11
саша40, здравствуй
проблема в том, что иногда программа сортирует это вроде бы хорошо, но не до конца, так как первые 2 элемента не меняет местами
Сможете помочь?
0
379 / 332 / 89
Регистрация: 26.05.2010
Сообщений: 750
27.05.2017, 18:37 12
Вот держи код пирамидальной сортировки, когда учился делал с чужого кода:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
procedure HeapSort(var List: Array of integer; min, max: integer);
var
  i, tmp: integer;
  //
  procedure HeapPushDown(var List: Array of integer; min, max: Longint);
  var
    tmp, j: Longint;
  begin
    tmp := List[min];
    repeat // Repeat infinitely.
      j := 2 * min;
      if (j > max) then
        break // Done. Past end of heap.
      else
      begin
        // Make j the larger of the children.
        if (j < max) then
          if (List[j + 1] > List[j]) then
            j := j + 1;
 
        if (List[j] > tmp) then
        begin
          // A child is bigger. Swap with child.
          List[min] := List[j];
          // Push down beneath that child.
          min := j;
        end
        else
          // The parent is bigger. We're done.
          break;
      end;
    until (False);
    List[min] := tmp;
  end;
//
 
begin
  for i := (max + min) div 2 downto min + 1 do
    HeapPushDown(List, i, max);
 
 
  for i := max downto min + 1 do
  begin
 
    HeapPushDown(List, min, i);
 
    tmp := List[min];
    List[min] := List[i];
    List[i] := tmp;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Mas: array[1..20] of integer;
  i: Integer;
begin
  Randomize;
 
  for i := 1 to 20 do
    begin
      Mas[i] := Random (100) - 25;
      memo1.Lines.Add(IntToStr(Mas[i]));
    end;
 
    HeapSort(Mas, 0, 20);
 
    for i := 1 to 20 do
    begin
      memo2.Lines.Add(IntToStr(Mas[i]));
    end;
 
end;
1
27.05.2017, 18:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2017, 18:37
Помогаю со студенческими работами здесь

Пирамидальная сортировка строк
Добрый вечер уважаемые! Есть код для пирамидальной сортировки обычных чисел. Подскажите пожалуйста...

Пирамидальная сортировка с каждым шагом
Есть программа с пирамидальной сортировкой которую я взял с прошлых тем, но проблема в том, что...

Пирамидальная сортировка дробных чисел
Доброго времени суток!Помогите написать код,на основе данного,который будет сортировать ДРОБНЫЕ...

Рекурсия. Пример использования рекурсивных функций. Пирамидальная сортировка массива
Нужно создать программу которая будет использовать рекурсию я пирамидальной сортировки массива....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru