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
| #include <vcl.h>
#pragma hdrstop
#include <time.h>
#include "Unit1.h"
#include "SortMarking.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define ch(A) digit(A, d)
int N = 10000;
int* Mas1;
void generator(int maxN);
template <class Item>
void quicksortX(Item a[], int l, int r, int d)
{
int i, j, k, p, q; int v;
if (r-l <= M) { insertion(a, l, r); return; }
v = ch(a[r]); i = l-1; j = r; p = l-1; q = r;
while (i < j)
{
while (ch(a[++i]) < v) ;
while (v < ch(a[--j])) if (j == l) break;
if (i > j) break;
exch(a[i], a[j]);
if (ch(a[i])==v) { p++; exch(a[p], a[i]); }
if (v==ch(a[j])) { q--; exch(a[j], a[q]); }
}
if (p == q)
{ if (v != '\0') quicksortX(a, l, r, d+1);
return; }
if (ch(a[i]) < v) i++;
for (k = l; k <= p; k++, j--) exch(a[k], a[j]);
for (k = r; k >= q; k--, i++) exch(a[k], a[i]);
quicksortX(a, l, j, d);
if ((i == r) && (ch(a[i]) == v)) i++;
if (v != '\0') quicksortX(a, j+1, i-1, d+1);
quicksortX(a, i, r, d);
};
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
time_t start;
AnsiString s;
start = clock();
generator(N);
Memo1->Lines->Add("Èñõîíûé ìàññèâ:");
for(int i = 0; i<N; ++i) s = s + " " + IntToStr(Mas1[i]);
Memo1->Lines->Add(s);
quickSortX(Mas1, 0, N - 1, 3);
Memo1->Lines->Add("");
Memo1->Lines->Add("Îòñîðòèðîâàííûé ìàññèâ:");
s = "";
for(int i = 0; i<N; ++i) s = s + " " + IntToStr(Mas1[i]);
Memo1->Lines->Add(s);
Memo1->Lines->Add("");
Memo1->Lines->Add("Ïðîøëî " + AnsiString((clock() - start)/CLOCKS_PER_SEC) + " ñåêóíä.");
}
void generator(int maxN)
{
randomize();
if(maxN<=0) return;
if((Mas1=(int *)calloc(maxN,sizeof(int)))==NULL)
{
ShowMessage("Out of memorry!") ;
exit(1);
}
for(int c=0;c<maxN;++c) Mas1[c]= random(1000) - random(1000);
} |