Лабораторные работы № 2 и 3
.pdf2 Выполнение работы |
11 |
44}
45pivot = x[j];
46while (i < j) {
4731.51\% while (x[i] < pivot) {
48 |
0.68\% |
i++; |
49 |
|
} |
50 |
4.79\% |
j--; |
51 |
15.07\% |
while ((i < j) && (pivot < x[j])) { |
52 |
0.68\% |
j--; |
53 |
|
} |
54 |
5.48\% |
if (i < j) { |
55 |
|
swap(x[i], x[j]); |
56}
57}
58j = right[sp];
59 |
1.37\% |
swap(x[i], x[j]); |
|
60 |
|
if (i - left[sp] >= right[sp] - i) { |
|
61 |
0.68\% |
left[sp+1] |
= left[sp]; |
62 |
0.68\% |
right[sp+1] = i - 1; |
|
63 |
1.37\% |
left[sp] = i + |
1; |
64}
65else {
66left[sp+1] = i + 1;
67right[sp+1] = right[sp];
68right[sp] = i - 1;
69}
70 0.68% |
sp++; |
71}
72}
73}
75bool verify(TArray &x, int dim) {
76int i = 0;
77while ((x[i] <= x[i+1]) && (i+1 <= dim)) {
78i++;
79}
800.68\% if (i == dim) {
81return true;
82}
83else {
84return false;
85}
87 }
89void init(TArray &x, int dim) {
904.11\% for (int i = 0; i <= dim; i++) {
91 |
1.37\% |
x[i] = random(100); |
92 |
|
} |
94 |
|
} |
96void main() {
97TArray a;
98int n = 19;
99randomize();
100for (int t = 0; t <= 31999; t++) {
101init(a, n);
102qsort(a, n);
103verify(a, n);
104}
105return;
106}
Event-Based Sampling
6#include <stdlib.h>
8typedef double TArray[20];
10 |
0.44\% |
void swap(double &p, double &q) { |
11 |
0.69\% |
double tmp = p; |
12 |
0.84\% |
p = q; |
13 |
0.82\% |
q = tmp; |
14 |
0.60\% |
} |
16 |
0.00\% |
void qsort(TArray &x, int n) { |
17int left[21];
18int right[21];
19 |
0.00\% |
left[1] = 1; |
20 |
0.01\% |
right[1] = n; |
|
|
|
2 |
Выполнение работы |
12 |
||
21 |
0.00\% |
int |
sp = 1; |
|
22 |
0.01\% |
int |
i = 0; |
|
23 |
0.00\% |
int |
j = 0; |
|
24 |
0.00\% |
int |
mid = 0; |
|
25 |
|
double pivot; |
|
|
26 |
1.22\% |
while (sp) { |
|
|
27 |
1.61\% |
if (left[sp] >= right[sp]) { |
|
|
28 |
0.19\% |
|
sp--; |
|
29 |
1.15\% |
} |
|
|
30 |
|
else { |
|
|
31 |
1.43\% |
|
i = left[sp]; |
|
32 |
0.19\% |
|
j = right[sp]; |
|
33 |
0.99\% |
|
pivot = x[j]; |
|
34 |
0.48\% |
|
mid = ((i+j) / 2); |
|
35 |
0.22\% |
|
if ((j - i) > 5) { |
|
36 |
5.19\% |
if ( ((x[mid] < pivot) && (x[mid] > x[i])) || |
|
|
|
|
|
((x[mid] > pivot) && (x[mid] < x[i])) ) { |
|
37 |
0.42\% |
|
swap(x[mid], x[j]); |
|
38 |
0.01\% |
} |
|
|
39 |
|
else { |
|
|
40 |
1.37\% |
|
if ( ((x[i] < x[mid]) && (x[i] > pivot)) || |
|
|
|
|
((x[i] > x[mid]) && (x[i] < pivot)) ) { |
|
41 |
0.28\% |
|
swap(x[i], x[j]); |
|
42 |
|
|
} |
|
43}
44}
45 |
1.01\% |
pivot = x[j]; |
46 |
1.67\% |
while (i < j) { |
47 |
29.69\% |
while (x[i] < pivot) { |
48 |
0.72\% |
i++; |
49 |
|
} |
50 |
5.17\% |
j--; |
51 |
12.99\% |
while ((i < j) && (pivot < x[j])) { |
52 |
0.32\% |
j--; |
53 |
|
} |
54 |
5.07\% |
if (i < j) { |
55 |
1.69\% |
swap(x[i], x[j]); |
56}
57}
58 |
0.31\% |
|
j = right[sp]; |
59 |
1.13\% |
|
swap(x[i], x[j]); |
60 |
0.68\% |
|
if (i - left[sp] >= right[sp] - i) { |
61 |
0.67\% |
|
left[sp+1] = left[sp]; |
62 |
0.19\% |
|
right[sp+1] = i - 1; |
63 |
0.34\% |
left[sp] = i + 1; |
|
64 |
0.17\% |
|
} |
65 |
|
else |
{ |
66 |
0.76\% |
|
left[sp+1] = i + 1; |
67 |
0.23\% |
right[sp+1] = right[sp]; |
|
68 |
0.22\% |
|
right[sp] = i - 1; |
69 |
|
} |
|
70 |
0.17\% |
|
sp++; |
71 |
|
} |
|
72 |
|
} |
|
73 |
0.35\% |
} |
|
75 |
0.02\% |
bool verify(TArray &x, int dim) { |
|
76 |
0.02\% |
int |
i = 0; |
77 |
1.08\% |
while ((x[i] <= x[i+1]) && (i+1 <= dim)) { |
|
78 |
0.00\% |
i++; |
79}
800.05\% if (i == dim) {
81 0.02\% |
return true; |
82}
83else {
84 |
0.00\% |
return false; |
85 |
|
} |
86 |
|
|
87 |
0.02\% |
} |
89 |
0.02\% |
void init(TArray &x, int dim) { |
90 |
3.68\% |
for (int i = 0; i <= dim; i++) { |
91 |
2.10\% |
x[i] = random(100); |
92 |
|
} |
93 |
|
|
94 |
0.02\% |
} |
|
|
|
4 SAMPLER наносит ответный удар |
13 |
96void main() {
97TArray a;
98int n = 19;
99randomize();
1000.03\% for (int t = 0; t <= 31999; t++) {
101 |
0.03\% |
init(a, n); |
102 |
0.04\% |
qsort(a, n); |
103 |
0.06\% |
verify(a, n); |
104}
105return;
106}
107
3.Заключение
Врезультате выполнения работы удалось установить следующие особенности профилировщика VTune:
•способ взятия проб на основании событий процессора (event-based) дает более подробные и точные результаты нежели способ на основании промежутков времени (time-based);
•с другой стороны, результаты time-based sampling в целом похожи на результаты, полученные с помощью event-based sampling;
•на основании тестовой программы test_cyc.c удалось установить, что VTune обрабатывает одинаково записанные разными способами инструкции;
•цели, которые преследовала программа test_sub.c (а именно время работы функций с разными параметрами) достигнуть в профилировщике не удалось;
Применительно к программам быстрой сортировки удалось установить следующее:
•результаты зацикленной программы быстрой сортировки не сильно различаются для time-based и event-based способов получения образцов (что впрочем не отменяет большую точность второго способа);
•показания для объектного кода, сгенерированного различными компиляторами с различных языков различаются при обоих способах получения образцов.
•наиболее эффективным местом (с точки зрения повышения скорости программы) для внесения изменений следует считать проверки условий, которые требуют нескольких сравнений одновременно. Эти участки кода выполняются очень часто и повышение их эффективности может дать прирост производительности.
4.Sampler наносит ответный удар
Компиляция программ выполнялась под Borland Pascal 7 и Turbo C++ 3.0.
4 SAMPLER наносит ответный удар |
14 |
4.1. test_cyc.cpp
Листинг 3. test_cyc.c (C)
void main()
{
SAMPLE;
for(i=0;i<Size/10;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
5SAMPLE;
for(i=0;i<Size/5;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
for(i=0;i<Size/2;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
10for(i=0;i<Size;i++) { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
for(i=0;i<Size/10;i++)
{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
15for(i=0;i<Size/5;i++)
{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
for(i=0;i<Size/2;i++)
{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
20SAMPLE; for(i=0;i<Size;i++)
{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;
for(i=0;i<Size/10;i++)
25 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp;
};
SAMPLE;
30for(i=0;i<Size/5;i++)
{tmp=dim[0];
dim[0]=dim[i];
dim[i]=tmp;
};
35SAMPLE; for(i=0;i<Size/2;i++)
|
|
|
{ tmp=dim[0]; |
|
|
|
||
|
|
|
dim[0]=dim[i]; |
|
|
|
||
|
|
|
dim[i]=tmp; |
|
|
|
||
40 |
|
|
}; |
|
|
|
|
|
|
|
|
SAMPLE; |
|
|
|
|
|
|
|
|
for(i=0;i<Size;i++) |
|
|
|||
|
|
|
{ tmp=dim[0]; |
|
|
|
||
|
|
|
dim[0]=dim[i]; |
|
|
|
||
45 |
|
|
dim[i]=tmp; |
|
|
|
||
|
|
|
}; |
|
|
|
|
|
} |
|
SAMPLE; |
|
|
|
|
||
|
|
|
|
|
|
|
||
|
|
|
||||||
|
|
Таблица с результатами измерений ( используется 13 из 416 записей ) |
||||||
Исх.Поз. Прием.Поз. |
Общее время(мкс) |
Кол-во прох. Среднее время(мкс) |
||||||
---------------------------------------------------------------------- |
||||||||
1 |
: |
8 |
1 : |
10 |
4.19 |
1 |
4.19 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
10 |
1 : |
12 |
7.54 |
1 |
7.54 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
12 |
1 : |
14 |
20.11 |
1 |
20.11 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
14 |
1 : |
16 |
40.23 |
1 |
40.23 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
16 |
1 : |
19 |
3.35 |
1 |
3.35 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
19 |
1 : |
22 |
8.38 |
1 |
8.38 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
22 |
1 : |
25 |
20.11 |
1 |
20.11 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: |
25 |
1 : |
28 |
39.39 |
1 |
39.39 |
----------------------------------------------------------------------
4 SAMPLER наносит ответный удар |
|
15 |
||||||
1 |
: |
28 |
1 |
: |
34 |
4.19 |
1 |
4.19 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
34 |
1 |
: |
40 |
8.38 |
1 |
8.38 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
40 |
1 |
: |
46 |
20.11 |
1 |
20.11 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
46 |
1 |
: |
52 |
203.66 |
1 |
203.66 |
4.2. test_sub.c
Листинг 4. test_sub.c (C)
void TestLoop(int nTimes)
{
static int TestDim[Size]; int tmp;
5int iLoop;
while (nTimes > 0)
{
nTimes −−;
10
iLoop = Size; while (iLoop > 0)
{
iLoop −− ;
15tmp = TestDim[0];
TestDim[0] = TestDim[nTimes]; TestDim[nTimes] = tmp;
}
}
20 } / TestLoop /
void main()
{
SAMPLE;
25TestLoop(Size / 10); // 100 1000
SAMPLE;
TestLoop(Size / 5); // 200 1000 SAMPLE;
TestLoop(Size / 2); // 500 1000
30SAMPLE;
TestLoop(Size / 1); // 1000 1000 SAMPLE;
}
Таблица с результатами измерений ( используется 5 из 416 записей )
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 29 1 : 31 227.12 1 227.12
----------------------------------------------------------------------
1 : 31 1 : 33 620.19 1 620.19
----------------------------------------------------------------------
1 : 33 1 : 35 1175.85 1 1175.85
----------------------------------------------------------------------
1 : 35 1 : 37 2453.11 1 2453.11
4.3. Быстрая сортировка
4.3.1. Pascal
Полное время работы
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 1 1 : 2 205.33 1 205.33
4 SAMPLER наносит ответный удар |
16 |
|||||||
Время функциональных участков |
|
|||||||
Исх.Поз. Прием.Поз. |
Общее время(мкс) |
Кол-во прох. Среднее время(мкс) |
||||||
---------------------------------------------------------------------- |
||||||||
1 |
: |
1 |
1 |
: |
2 |
0.84 |
1 |
0.84 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
2 |
1 |
: |
3 |
37.71 |
1 |
37.71 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
3 |
1 |
: |
11 |
0.00 |
1 |
0.00 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
4 |
1 |
: |
5 |
15.92 |
1 |
15.92 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
11 |
1 |
: |
12 |
0.00 |
1 |
0.00 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
12 |
1 |
: |
13 |
0.00 |
1 |
0.00 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
13 |
1 |
: |
14 |
0.00 |
71 |
0.00 |
1 |
: |
13 |
1 |
: |
13 |
126.55 |
71 |
1.78 |
1 |
: |
13 |
1 |
: |
24 |
0.00 |
1 |
0.00 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
14 |
1 |
: |
15 |
6.70 |
6 |
1.12 |
1 |
: |
14 |
1 |
: |
17 |
157.56 |
63 |
2.50 |
1 |
: |
14 |
1 |
: |
16 |
2.51 |
2 |
1.26 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
15 |
1 |
: |
17 |
0.00 |
6 |
0.00 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
16 |
1 |
: |
17 |
0.84 |
2 |
0.42 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
17 |
1 |
: |
19 |
12.57 |
71 |
0.18 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
19 |
1 |
: |
20 |
154.21 |
191 |
0.81 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
20 |
1 |
: |
21 |
693.94 |
191 |
3.63 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
21 |
1 |
: |
19 |
264.84 |
120 |
2.21 |
1 |
: |
21 |
1 |
: |
22 |
124.88 |
71 |
1.76 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
22 |
1 |
: |
23 |
124.88 |
71 |
1.76 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
23 |
1 |
: |
13 |
274.06 |
71 |
3.86 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
24 |
1 |
: |
4 |
0.00 |
1 |
0.00 |
4.3.2. |
C |
|
|
|
|
|
||
Полное время работы |
|
|
||||||
Исх.Поз. Прием.Поз. |
Общее время(мкс) |
Кол-во прох. Среднее время(мкс) |
||||||
---------------------------------------------------------------------- |
||||||||
1 |
: 107 |
1 |
: 117 |
24.30 |
1 |
24.30 |
||
Время функциональных участков |
|
|||||||
Исх.Поз. Прием.Поз. |
Общее время(мкс) |
Кол-во прох. Среднее время(мкс) |
||||||
---------------------------------------------------------------------- |
||||||||
1 |
: |
14 |
1 |
: |
24 |
0.84 |
1 |
0.84 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
24 |
1 |
: |
26 |
3.35 |
1 |
3.35 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
26 |
1 |
: |
35 |
11.73 |
12 |
0.98 |
1 |
: |
26 |
1 |
: |
26 |
10.90 |
12 |
0.91 |
1 |
: |
26 |
1 |
: |
82 |
0.84 |
1 |
0.84 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
35 |
1 |
: |
43 |
10.90 |
3 |
3.63 |
1 |
: |
35 |
1 |
: |
48 |
7.54 |
9 |
0.84 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
43 |
1 |
: |
48 |
5.87 |
3 |
1.96 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
48 |
1 |
: |
54 |
10.90 |
12 |
0.91 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
54 |
1 |
: |
59 |
21.79 |
24 |
0.91 |
|
|
|
|
|
|
|
|
|
5 |
|
Заключение |
|
|
17 |
|||
---------------------------------------------------------------------- |
||||||||
1 |
: |
59 |
1 |
: |
63 |
20.95 |
24 |
0.87 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
63 |
1 |
: |
54 |
11.73 |
12 |
0.98 |
1 |
: |
63 |
1 |
: |
65 |
10.06 |
12 |
0.84 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
65 |
1 |
: |
79 |
12.57 |
12 |
1.05 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
79 |
1 |
: |
26 |
7.54 |
12 |
0.63 |
---------------------------------------------------------------------- |
||||||||
1 |
: |
82 |
1 |
: 115 |
0.84 |
1 |
0.84 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: 107 |
1 |
: 111 |
5.03 |
1 |
5.03 |
||
---------------------------------------------------------------------- |
||||||||
1 |
: 111 |
1 |
: 113 |
5.87 |
1 |
5.87 |
||
---------------------------------------------------------------------- |
||||||||
1 |
: 113 |
1 |
: |
14 |
0.84 |
1 |
0.84 |
|
---------------------------------------------------------------------- |
||||||||
1 |
: 115 |
1 |
: 117 |
2.51 |
1 |
2.51 |
5.Заключение
Врезультате работы с профилировщиком Sample удалось установить:
•время работы с библиотеками Sampler, откомпилированным под Pascal на отдельных участках значительно превосходит время работы с модулями C, что, с другой стороны, можно списать на исполнение Sampler не в родной ему операционной системе. В связи с этим тяжело сделать заключение о похожести характеристик модулей на различных языках;
•на основании тестовых программы test_cyc.c, test_sub.c удалось установить, что Sampler обрабатывает одинаково записанные разными способами инструкции и перенесенные в подпрограммы инструкции;
•полученные с использованием Sampler результаты в целом согласуются с результатами, полученными с использованием VTune.
А Разметка для SAMPLER |
18 |
А. Разметка для Sampler
Листинг 5. Быстрая сортировка (Pascal)
program prog_pas;
uses sampler;
5const
N = 100;
name = "prog_pas.pas";
type
10 TArray = array [1..N] of real;
procedure swap(var p,q: real); var hold : real ;
begin
15hold:=p;
p:=q;
q:=hold end;
20 procedure qsort(var x: TArray; n: integer);
var left , right |
: |
array [1..20] of integer ; |
i , j ,sp,mid |
: |
integer ; |
pivot |
: |
real ; |
25
begin sample(name, 11); left [1]:=1;
right [1]:=n;
30sp:=1; sample(name, 12); while sp>0 do
begin sample(name, 13);
35 if left [sp]>=right[sp] then begin sp:=sp−1
end
else begin
i:=left [sp ];
40j:=right[sp ]; pivot:=x[j ]; mid:=(i+j)div 2;
sample(name, 14); if ( j−i)>5 then begin
45 if ((x[mid]<pivot)and(x[mid]>x[i])) or ((x[mid]>pivot)and(x[mid]<x[i])) then begin
sample(name, 15); swap(x[mid],x[j ])
end
else begin
50if ((x[ i]<x[mid])and(x[i]>pivot)) or ((x[i]>x[mid])and(x[i]<pivot)) then begin sample(name, 16);
swap(x[i ], x[j ]) ;
|
end; |
|
end; |
55 |
end; |
|
sample(name, 17); |
|
pivot:=x[j ]; |
|
while i<j do begin |
60 |
while x[i]<pivot do begin |
|
i:=i+1; |
|
end; |
|
sample(name, 19); |
|
j:=j−1; |
65 |
while (i<j)and(pivot<x[j]) do begin |
j:=j−1; end;
sample(name, 20);
А |
Разметка для SAMPLER |
19 |
|
|
|
if i<j then swap(x[i],x[j ]) ; |
|
70 |
|
sample(name, 21); |
|
|
|
end; |
|
|
|
sample(name, 22); |
|
|
|
j:=right[sp ]; { pivot to i } |
|
|
|
swap(x[i ], x[j ]) ; |
|
75 |
|
if i−left[sp]>=right[sp]−i then begin |
|
|
|
left [sp+1]:=left[sp ]; |
|
|
|
right [sp+1]:=i−1; |
|
|
|
left [sp]:=i+1 |
|
|
|
end |
|
80 |
|
else begin |
|
|
|
left [sp+1]:=i+1; |
|
right [sp+1]:=right[sp]; right [sp]:=i−1
end;
85sp:=sp+1; sample(name, 23);
end; end;
sample(name, 24);
90end;
function verify(var x: TArray; dim: integer) : boolean; var
i : integer ;
95begin
i := 1;
while (x[i] <= x[i+1]) and (i+1 <= dim) do begin i := i+1;
end;
100 if ( i = dim) then verify := true
else
verify := false ; end;
105
procedure init(var x: TArray; dim: integer); var
i : integer ; begin
110 for i := 1 to dim do begin x[ i ] := random(100);
end; end;
115 var
a: TArray; t : integer ;
begin sample(name, 1);
120randomize; sample(name, 2);
init (a, n); sample(name, 3); qsort(a, n);
125 sample(name, 4); verify (a, n);
sample(name, 5); end.
Листинг 6. Быстрая сортировка (C)
#include <stdlib.h> #include <stdio.h> #include "sampler.h"
5typedef double TArray[21];
void swap(double &p, double &q) {
double tmp = p; p = q;
10 q = tmp;
}
А Разметка для SAMPLER |
20 |
void qsort(TArray x, int n) { SAMPLE;
15int left [21]; int right [21]; left [1] = 1;
right [1] = n; int sp = 1;
20int i = 0; int j = 0; int mid = 0; double pivot; SAMPLE;
25 while (sp) { SAMPLE;
if ( left [sp] >= right[sp]) { sp−−;
}
30else {
i = left [sp ]; j = right[sp ]; pivot = x[j ];
|
mid = ((i+j) / 2); |
35 |
SAMPLE; |
|
if (( j − i) > 5) { |
if |
( (( x[mid] < pivot) && (x[mid] > x[i])) || (( x[mid] > pivot) && (x[mid] < x[i])) ) { |
|
SAMPLE; |
|
swap(x[mid], x[j ]) ; |
40}
else {
|
if ( (( x[ i ] < x[mid]) && (x[i] > pivot)) || (( x[ i ] > x[mid]) && (x[i] < pivot)) ) { |
|
SAMPLE; |
|
swap(x[i ], x[j ]) ; |
45 |
} |
|
} |
|
} |
|
SAMPLE; |
|
pivot = x[j ]; |
50 |
while (i < j) { |
while (x[ i ] < pivot) { i++;
}
SAMPLE;
55j−−;
while ((i < j) && (pivot < x[j])) { j−−;
}
SAMPLE;
60 if ( i < j) { swap(x[i ], x[j ]) ;
}
SAMPLE;
}
65SAMPLE;
j = right[sp ];
swap(x[i ], x[j ]) ;
if ( i − left [sp] >= right[sp] − i) { left [sp+1] = left[sp ];
70right [sp+1] = i − 1; left [sp] = i + 1;
}
else {
left [sp+1] = i + 1;
75 |
right [sp+1] = right[sp ]; |
|
right [sp] = i − 1; |
|
} |
|
sp++; |
|
SAMPLE; |
80 |
} |
|
} |
|
SAMPLE; |
|
} |
85 |
int verify (TArray &x, int dim) { |
|
|