-
Notifications
You must be signed in to change notification settings - Fork 0
/
sort.pas
90 lines (74 loc) · 1.91 KB
/
sort.pas
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
const
m = 100;
var
cmp, swp: integer;
type
ar = array[1..m] of integer;
procedure generate(p: integer; N: integer; var a: ar);
var i: integer;
begin
randomize;
a[1] := random(32000);
if p = 1 then
for i := 2 to N do
a[i] := a[i-1] - random(32000);
if p = 2 then
for i := 2 to N do
a[i] := a[i-1] + random(32000);
if p > 2 then
for i := 2 to N do
a[i] := random(32000);
end;
procedure sort_bubble(N: integer; var x: ar);
var i, j, k: integer;
begin
for i := 1 to N-1 do
for j := 1 to N-i do begin
if x[j] < x[j+1] then begin //если элемент меньше следующего, меняем местами
k := x[j];
x[j] := x[j+1];
x[j+1] := k;
swp := swp + 1;
end;
cmp := cmp + 1;
end;
end;
procedure sort_Shell(N: integer; var x: ar);
var
s, i, j, k: integer;
begin
s := N div 2;
while s > 0 do begin
for i := 1 to N do begin
j := i+s; //смотрим на элементы, отличающиеся на s позиций
while j <= N do begin
if x[i] < x[j] then begin
k := x[j]; //если i-й элемент меньше j-го, меняем местами
x[j] := x[i];
x[i] := k;
swp := swp + 1;
end;
cmp := cmp + 1;
j := j+s; //переходим на следующий элемент через s позиций
end;
end;
s := s div 2; //уменьшаем s
end;
end;
var
N, i: integer;
a: ar;
begin
cmp := 0;
swp := 0;
readln(N);
generate(2, N, a);
//for i := 1 to N do read(a[i]);
for i := 1 to N do write(a[i], ' ');
writeln;
//sort_bubble(N, a);
sort_Shell(N, a);
for i := 1 to N do write(a[i], ' ');
writeln;
write(cmp, ' ', swp);
end.