0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
1

Сортировка последовательности целых чисел методом прямого слияния и методом цифровой сортировки

30.01.2011, 17:46. Показов 2794. Ответов 3
Метки нет (Все метки)

Задание звучит вот так:
1.Разработать процедуры сортировки последовательности целых чисел методом прямого слияния и методом цифровой сортировки (язык программирования Паскаль или Си).
2.Во время сортировки предусмотреть подсчет количества пересылок элементов в очередь и сравнений (М и С)
Как реализовать подсчёт, помогите!

Метод слияния
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
program Slip;
uses
  crt;
type
ptr=^tptr;
Tptr=record
  name:integer;
  next:ptr;
end;
var
N:integer;
procedure PrintMas(pos:ptr);           {вывод на экран}
begin
while pos<>nil do
begin
  write(pos^.naME:8);
  pos:=pos^.next;
end;
end;
 
function CreateMas(N:integer):ptr;      {создание массива}
var
  p:ptr;
  i:integer;
begin
randomize;
new(p);
CreateMas:=p;
p^.name:=random(90)+10;
for i:=2 to N do
  begin
    new(p^.next);
    p:=p^.next;
    p^.name:=random(90)+10;
  end;
  p^.next:=nil;
end;
{деление массива на две части с чередованием по N элементов}
procedure DelMasAsN(S:ptr;var a,b:ptr;N:integer);
var
  I:integer;
  f:boolean;
  a1,b1,a2,b2,s1:ptr;
begin
new(a);
new(b);
a1:=a;
b1:=b;
s1:=s;
f:=false;
i:=-1;
while s<>nil do
  begin
  inc(i);
  if (i mod N)=0 then
    if f then f:=false
    else f:=true;
 
  if f then
    begin
    {a массив}
      a1^.name:=s^.name;
      new(a1^.next);
      a2:=a1;
      a1:=a1^.next;
    end
  else
    begin
    {b массив}
      b1^.name:=s^.name;
      new(b1^.next);
      b2:=b1;
      b1:=b1^.next;
    end;
    s:=s^.next;
  end;
Dispose(a1);
Dispose(b1);
a1:=a2;
b1:=b2;
a1^.next:=nil;
b1^.next:=nil;
s:=s1;
while s1<>nil do
  begin
    s:=s1^.next;
    Dispose(s1);
    s1:=s;
  end;
end;
 
function LenMas(s:ptr):integer; {длина массива}
var
  I:integer;
begin
i:=0;
  while (s<>nil) do
  begin
    inc(i);
    s:=s^.next;
  end;
LenMas:=i;
end;
 
procedure SlipMas(a,b:ptr;var C:ptr);   {слияние массива}
var
  q,r:integer;
  c1,c2:ptr;
begin
  c:=nil;
  if (a=nil) and (b=nil) then exit;
  q:=LenMas(a);
  r:=LenMas(b);
  new(c);
  c1:=c;
  while ((q<>0) and (r<>0)) do
    begin
      if (a^.name<=b^.name) then
        begin
          c1^.name:=a^.name;
          a:=a^.next;
          q:=q-1;
        end
      else
        begin
          c1^.name:=b^.name;
          b:=b^.next;
          r:=r-1;
        end;
      new(c1^.next);
      c2:=c1;
      c1:=c1^.next;
    end;
  while q>0 do
    begin
      c1^.name:=a^.name;
      a:=a^.next;
      q:=q-1;
      new(c1^.next);
      c2:=c1;
      c1:=c1^.next;
    end;
  while r>0 do
    begin
      c1^.name:=b^.name;
      b:=b^.next;
      r:=r-1;
      new(c1^.next);
      c2:=c1;
      c1:=c1^.next;
    end;
  Dispose(c1);
  c1:=c2;
  c1^.next:=nil;
end;
{копирование части массива из S массива с i-го символа длинной count}
function CopyMas(S:ptr;i,count:integer):ptr;
var
  p,p1:ptr;
  l,j,k:integer;
begin
CopyMas:=nil;
if LenMas(S)<i then exit;
new(p);
Copymas:=p;
j:=0;
k:=0;
while s<>nil do
  begin
    inc(j);
    if j>=i then
      begin
        inc(k);
        if (k<=count) then
          begin
            p^.name:=s^.name;
            new(p^.next);
            p1:=p;
            p:=p^.next;
          end;
      end;
    s:=s^.next;
  end;
  Dispose(p);
  p:=p1;
  p^.next:=nil;
end;
 
procedure DestroyMas(S:ptr);  {разрушение массива}
var
 S1:ptr;
begin
s1:=s;
while s1<>nil do
  begin
    s:=s1^.next;
    Dispose(s1);
    s1:=s;
  end;
end;
  {яЁюуЁрььр ёыш*эш}
 
procedure Exempel(S:ptr; var C:ptr);
var
  L,n,i,x:integer;
  a,b,a0,b0,a1,b1,c0,c1,ax,bx,ahead,bhead:ptr;
begin
  L:=LenMas(S);           {определяю длинну}
  DelMasAsN(S,a,b,1);     {делю пополам с чередованием 1}
  printMas(a);
  writeln;
  printMas(b);
  writeln;
  writeln;
  n:=1;
while (L>=2*n) do        {цикл определяет число итераций}
begin
  i:=1;
  while (L div 2)>=i do   {цикл формирования массивов с0 и с1  }
  begin
    a0:=CopyMas(a,i,n);   {копирую из массива элементы с очередностью n в a0}
    b0:=CopyMas(b,i,n);
    SlipMas(a0,b0,c0);    {сливаю эти элементы}
    DestroyMas(a0);       {роазрушаю ненужные массивы}
    DestroyMas(b0);
    i:=i+n;               {закончено формирование части элементов массива с0}
    a1:=CopyMas(a,i,n);
    b1:=CopyMas(b,i,n);
    SlipMas(a1,b1,c1);
    DestroyMas(a1);
    DestroyMas(b1);       {закончено формирование части элементов массива с1 }
    if i=(1+n) then       {слияние всех кусочков массива с1 и с0 }
      begin
        ahead:=c0;
        bhead:=c1;
        while c0^.next<>nil do c0:=c0^.next;
        while c1^.next<>nil do c1:=c1^.next;
        ax:=c0;
        bx:=c1;
        ax^.next:=nil;
        bx^.next:=nil;
      end
    else
      begin
        ax^.next:=c0;
        bx^.next:=c1;
        while ax^.next<>nil do ax:=ax^.next;
        while bx^.next<>nil do bx:=bx^.next;
        ax^.next:=nil;
        bx^.next:=nil;
      end;
    i:=i+n;
  end;
  DestroyMas(a);
  DestroyMas(b);
  a:=ahead;
  b:=bhead;
  printMas(a);    {вывод результата итерации}
  writeln;
  printMas(b);
  writeln;
  writeln;
  n:=2*n;
end;
  SlipMas(a,b,c);  {слияние оконечного результата}
end;
 
var
  head,mas:ptr;
begin
clrscr;
write('                    Введите количество элементов в массиве= ');
readln(N);
head:=CreateMas(N); {создаю массив элементов}
printmas(head);      {выважу на экран}
writeln;
Exempel(head,mas);   {сортирую}
printmas(mas);       {вывод конечного результата}
readln;
end.
Цифровая сортировка
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
program Digital;
 
uses
 crt,dos;
type
ptr=^tptr;
tptr=record
  Name:integer;
  next:ptr;
end;
var
NN:integer;
 
procedure PrintMas(pos:ptr);       {вывод элементов}
begin
while pos<>nil do
begin
  write(pos^.name:8);
  pos:=pos^.next;
end;
end;
 
function CreateMas(N:integer):ptr;      {создаю массив элементов}
var
  p:ptr;
  i:integer;
begin
randomize;
new(p);
CreateMas:=p;
p^.name:=random(90)+10;
for i:=2 to N do
  begin
    new(p^.next);
    p:=p^.next;
    p^.name:=random(90)+10;
  end;
  p^.next:=nil;
end;
 
Function IntToStr(I:integer):String;
{ Преобразовывает значение типа Integer в String }
Var S:String[10];
Begin
 Str(I,S);
 IntToStr:=S;
End;
 
Function Strtoint(S:string):integer ;
 {Преобразовывает значение типа String в integer }
Var E,L:integer;
Begin
E:=0;
 val(s,L,E);
{  if E<>0 then  }
 strtoint:=L;
End;
 
function infoMas(pos:ptr;var Count:integer;const index:integer):integer;
{определяет порядок элементов в массиве и их систему счисления}
var
  S:ptr;
x, L,L1:integer;
 name:string;
begin
{index:=1;}
  S:=pos;
  Count:=0;
  while S<>nil do
  begin
    name:=inttostr(S^.Name);
    L:=length(Name);
    if L>Count then Count:=L;
    S:=S^.next;
  end;
  S:=pos;
  L1:=0;
  while S<>nil do
  begin
    name:=inttostr(S^.Name);
    L:=length(Name);
    if count>=index then
      if L>=index then
        begin
         L:=strtoint(name[L+1-index]); 
          if L>=L1 then
        L1:=L;
        end;
    S:=S^.next;
  end;
  infomas:=L1;
end;
 
procedure DestroyMas(S:ptr);  {уничтожение всех элементов массива}
var
 S1:ptr;
begin
s1:=s;
while s1<>nil do
  begin
    s:=s1^.next;
    Dispose(s1);
    s1:=s;
  end;
end;
 
function digitMas(pos:ptr; index,digit:integer):ptr;
{процедура формирования массива по двум параметрам: }
{ dijit -системы счисленияш* index - параметр элемента}
var
  p,a,a1,heada:ptr;
  name:string;
  L:integer;
begin
  a1:=nil;
  p:=pos;
  new(heada);
  a:=heada;
  while p<>nil do
  begin
    Name:=inttostr(p^.name);
    L:=length(Name);
    if L>=index then
      begin
        if {strtoint}(name[l+1-index])=inttostr(digit) then
          begin
            a^.Name:=p^.Name;
            new(a^.next);
            a1:=a;
            a:=a^.next;
          end;
      end
    else
      if digit=0 then
      begin
        a^.Name:=p^.Name;
        new(a^.next);
        a1:=a;
        a:=a^.next;
      end;
    p:=p^.next;
  end;
  Dispose(A);
  a:=a1;
  DigitMas:=heada;
  if a<>nil then a^.next:=nil
  else DigitMas:=nil;
end;
 
var
  Head,p:ptr;
  a:string;
 b, L,k,i,j,n:integer;
  HeadMas:array[0..256] of ptr;
  begin
  clrscr;
   writeln;
   write('                 Введите количество элементов в массиве= ' );
  readln(NN);
  clrscr;
    head:=CreateMas(NN); {создаю массив}
      PrintMas(head);      {отображаю его}
      InfoMas(head,L,i);     {определяю число символов в элементе массива }
  for i:=1 to L do         {цикл прогонки по порядку цифр}
  begin
    k:=InfoMas(head,L,i);  {определяю систему счисления у i-ых символов}
    for j:=0 to k do       {цикл прогонки по системе счисления}
    begin
      HeadMas[j]:=digitMas(head,i,j); {создает массив из i-го порядка и
                                         j-ой системы счисления *}
      write('Q',j,':');
      PrintMas(HeadMas[j]);
      writeln;
    end;
    DestroyMas(head);        {разрушаю массив}
      for n:=0 to (k) do  {проверяю на наличие массива в массиве заголовк в Headmas}
    begin
      if HeadMas[n]<>nil then break;
    end;
    head:=HeadMas[n];     {устанавливаю n-й заголовок}
    p:=HeadMas[n];
    if p<>nil then                         {прогоняюмассив вконец}
    while p^.next<>nil do p:=p^.next;
    for j:=n to k do                    {формирую массив}
    begin
      p^.next:=headMas[j+1];
      if p<>nil then
      while p^.next<>nil do p:=p^.next;
    end;
    printmas(head); {вывод массива}
  end;
  readln;
end.
Добавлено через 9 часов 11 минут
Неужели никто не поможет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2011, 17:46
Ответы с готовыми решениями:

Сортировка методом прямого слияния
Помогите,отсортировать строки текстового файла в алфавитном порядке методом прямого слияния ...

Сортировка массива методом прямого выбора и методом прямого обмена (пузырьковая)
Сортировка в Delphi массива из 6 двухзначных чисел. Методом прямого выбора и методом прямого...

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

Сортировка методом прямого включения ( исправление метода сортировки )
Условие: Сгенерируйте случайным образом 20 целых чисел и поместите их в типизированный файл. ...

3
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
01.02.2011, 05:17  [ТС] 2
Помогите сдать надо....
0
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
06.03.2011, 11:29  [ТС] 3
Неужели не поможете?
0
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 28
18.02.2012, 19:43 4
Здравствуйте!
У меня к Вам вопрос: Реализовать процедуры сортировки последовательности целых чисел методом прямого слияния и методом цифровой сортировки?
2.Во время сортировки предусмотреть подсчет количества пересылок элементов в очередь и сравнений (М и С)?
Если Вы смогли реализовать подсчет пересылок M и C, не могли бы Вы мне помочь?!

С уважением,
Alina_1986
 Комментарий модератора 
Не стоит просить выслать ответ в icq или e-mail. Эта просьба все равно не будет выполнена, а сообщение скорее всего будет отредактировано модератором.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2012, 19:43
Помогаю со студенческими работами здесь

Исследование алгоритмов сортировки методом прямого включения и методом Шелла
Здравствуйте. Мне нужно написать программу в C# на тему &quot;Исследование алгоритмов сортировки методом...

Сортировки массива методом пузырька и методом прямого включения
сортировки массива методом пузырька и методом прямого включения Очень срочно надо помогите плис

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

Ускоренная сортировка методом пузырька и методом слияния
Друзья помогите. Условие задачи: Составить две программу, которые реализуют алгоритм ускоренной...

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

Сортировка последовательности методом быстрой сортировки
помогите :Написати програму для сортування послідовності 45 37 2 5 9 12 6 4 52 методом швидкого...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru