Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 02.12.2014
Сообщений: 6
1

Сортировка однонаправленного списка вставками

25.12.2014, 03:09. Показов 5210. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помогите реализовать сорртировку вставками в однонаправленном линейном списке
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2014, 03:09
Ответы с готовыми решениями:

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

Сортировка вставками
Создать массив, в котором n элементов. Сортировать первую треть масса по возрастанию, последнюю...

Сортировка вставками
Создайте массив, состоящий из 15 различных целых чисел. Отдельно 5 первых, вторых, третьих...

Сортировка вставками
Помогите пожалуйста составить несколько задач с массивами (программа + блок схема если это...

5
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
25.12.2014, 06:24 2
DIMASBATAYSK, интересный вопрос: «помогите реализовать»…
При этом не видно ни строчки твоего кода!
Т.е. получается не «помогите», а «сделайте за меня»…
Так бы сразу и говорил!
0
0 / 0 / 0
Регистрация: 02.12.2014
Сообщений: 6
25.12.2014, 22:23  [ТС] 3
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure sort (p: plist);
var
  t: plist;
  X: integer;
begin
  t := p^.link;
  if t <> nil then
 
    if p^.info > t^.info then begin
      X := t^.info;
      t^.info := p^.info;
      p^.info := X;
 
      sort (first);
    end
    else sort (p^.link);
end;
0
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
26.12.2014, 05:58 4
DIMASBATAYSK, то что ты привёл вообще не из той оперы, оперирует не элементами списка, а его значениями и, в добавок, написано не на PascalABC.NET…

Сортировка вставками работает по следующему принципу:
Считается, что начало списка уже отсортировано.
Берётся очередной символ и вставляется в нужное место списка,
при этом остальные элементы списка просто сдвигаются.

Соответственно для массива A[1..Size] будет вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
  for i := 2 to Size do
    begin
      Key := A[i];
      j := i - 1;
      while (j >= 1) and (A[j] > Key) do
        begin
          A[j + 1] := A[j];
          Dec(j);
        end;
      A[j + 1] := Key;
    end;
Для списка сдвиг пропускается, просто очередной элемент вырезается из своего старого положения и вставляется в новое.
0
Cyborg Drone
13.01.2015, 00:13
  #5

Не по теме:

Цитата Сообщение от JuriiMW Посмотреть сообщение
написано не на PascalABC.NET…
Вообще-то, это ветка форума Pascal ABC. Так, для общего развития: Pascal ABC и PascalABC.NET - это совершенно разные диалекты паскаля.

0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
14.01.2015, 08:48 6
Цитата Сообщение от DIMASBATAYSK Посмотреть сообщение
помогите реализовать сортировку вставками в однонаправленном линейном списке
Решение:
Pascal
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
program Project1;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип, описывающий указатель на элемент.}
  TPElem = ^TElem;
  {Тип, описывающий элемент списка.}
  TElem = record
    Data : TData;   {Основные данные элемента.}
    PNext : TPElem; {Указатель на следующий элемент.}
  end;
  {Тип, описывающий список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка. Иначе будут утечки памяти.}
procedure Init(var aL : TDList);
begin
  aL.PFirst := nil;
  aL.PLast := nil;
end;
 
{Освобождение памяти, занятой для элементов списка и инициализация.}
procedure LFree(var aL : TDList);
var
  P, PDel : TPElem;
begin
  P := aL.PFirst;  {Указатель на первый элемент списка.}
  while P <> nil do
  begin
    PDel := P;     {Запоминаем указатель на текущий элемент.}
    P := P^.PNext; {Получаем указатель на следующий элемент.}
    Dispose(PDel); {Освобождаем память, занятую текущим элементом списка.}
  end;
  Init(aL);
end;
 
{Добавление элемента в конец списка.}
procedure Add(var aL : TDList; const aData : TData);
var
  P : TPElem;
begin
  New(P);           {Выделяем паямять для элемента.}
  P^.Data := aData; {Записываем данные.}
  P^.PNext := nil;  {Обнуляем указатель на следующий элемент.}
  if aL.PFirst = nil then {Если список пуст, то новый элемент становится первым элементом списка.}
    aL.PFirst := P
  else {Если список непустой, то новый элемент прикрепляем к последнему элементу списка.}
    aL.PLast^.PNext := P;
  aL.PLast := P; {Новый элемент становится последним элементом списка.}
end;
 
{Распечатка списка.}
procedure LWriteln(const aL : TDList);
var
  P : TPElem;
begin
  P := aL.PFirst; {Указатель на первый элемент списка.}
  if P <> nil then
  repeat
    if P <> aL.PFirst then {Если элемент не первый в списке, то ставим перед ним запятую.}
      Write(', ');
    Write(P^.Data); {Распечатываем данные текущего элемента.}
    P := P^.PNext;  {Получаем указатель на следующий элемент.}
  until P = nil
  else
    Write('Список пуст.');
  Writeln;
end;
 
{Перестановка элемента aP^.PNext на позицию между элементами aPPos и aPPos^.PNext.}
procedure Recomb(var aL : TDList; var aP, aPPos : TPElem);
var
  P : TPElem;
begin
   P := aP^.PNext; {Указатель на элемент, который будем переставлять.}
  if aPPos = nil then {Вставка перед первым элементом.}
  begin
    aP^.PNext := P^.PNext;
    P^.PNext := aL.PFirst;
    aL.PFirst := P;
  end
  else                {Вставка между элементами.}
  begin
    aP^.PNext := P^.PNext;
    P^.PNext := aPPos^.PNext;
    aPPos^.PNext := P;
  end;
end;
 
{Сортировка однонаправленного списка по возрастанию методом вставок.}
procedure SortAsc(var aL : TDList);
var
  P1, P2, PPos1, PPos2 : TPElem;
begin
  {Если список пуст или содержит только один элемент, то выходим.}
  if aL.PFirst = aL.PLast then
    Exit;
 
  P1 := aL.PFirst; {Указатель на предыдущий элемент.}
  P2 := P1^.PNext; {Указатель на текущий элемент.}
  while P2 <> nil do {Перебор элементов списка, начиная со второго элемента.}
  begin
    {Поиск места вставки в уже отсортированной части списка.}
    PPos1 := nil;       {Указатель на предыдущий элемент.}
    PPos2 := aL.PFirst; {Указатель на текущий элемент.}
    while PPos2^.Data < P2^.Data do {Ограничивающее условие "(PPos2 <> P2) and" здесь можно не использовать.}
    begin
      PPos1 := PPos2;
      PPos2 := PPos2^.PNext;
    end;
    {Перестановка.}
    if PPos1 <> P1 then {Если место вставки отличается от текущей позиции, то выполняем перестановку.}
      Recomb(aL, P1, PPos1)
    else
      P1 := P2;
    P2 := P1^.PNext; {Получаем указатель на следующий элемент.}
  end;
end;
 
var
  L : TDList;
  Data : TData;
  i, Cnt : Integer;
  S : String;
begin
  Init(L); {Начальная инициализация списка.}
 
  repeat             
    {Создаём список.}
    Writeln('----------');
    Write('Задайте количество элементов: ');
    Readln(Cnt);
    for i := 1 to Cnt do
    begin
      Write('Элемент N ', i, ': ');
      Readln(Data);
      Add(L, Data);
    end;
    Writeln('Задан список:');
    LWriteln(L);
 
    SortAsc(L); {Сортировка списка по возрастанию.}
    Writeln('Список после сортировки:');
    LWriteln(L);
 
    {Освобождение памяти, занятой для элементов списка.}
    LFree(L);
    Writeln('Память, выделенная для списка, освобождена.');
 
    Write('Повторить - Enter, выход - любой символ + Enter. ');
    Readln(S);
  until S <> '';
end.
0
14.01.2015, 08:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2015, 08:48
Помогаю со студенческими работами здесь

Сортировка вставками
Здравствуйте, помогите пожалуйста, нужно написать программу сортировки одномерного массива по...

Сортировка вставками
1.)Сортировка вставками. Дана последовательность чисел a1, a2, ..., an. Требуется переставить числа...

Сортировка простыми вставками
Помогите, пожалуйста!!! На носу защита курсовой, а у меня многое не получается... Дана матрица....

Сортировка бинарными вставками.
Никак не могу написать программу для этого алгоритма. Или я что-то не так понимаю или реализую не...

Сортировка простыми вставками
Помоги пожалуйста с решением задачи!!!!!!! Дана последовательность 4 21 7 15 84 114 52 6....

Сортировка вставками со сторожевым элементом
Переделать программу на Pascal // сортировка вставками со сторожевым элементом template&lt;class T&gt;...


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

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