Subversion Repositories Kolibri OS

Rev

Rev 975 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
975 leency 1
//Быстрая сортировка. Leency 2008. GPL license.
2
 
3
void Sort_by_Size(int a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
4
{
5
	int i= a;
6
	IF (a >= b) return;
7
	FOR (j = a; j <= b; j++)
8
	{
9
		IF (ESDWORD[file_mas[j]*304 + buf+72-8] <= ESDWORD[file_mas[b]*304 + buf+72-8])
10
		{ file_mas[i] >< file_mas[j];   i++;}
11
	}
12
	Sort_by_Size (a, i-2);
13
	Sort_by_Size (i, b);
14
}
15
 
16
 
17
void Sort_by_Name(int a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
18
{
19
	int i = a;
20
	IF (a >= b) return;
21
	FOR (j = a; j <= b; j++)
22
		IF (strcmp(file_mas[j]*304 + buf+72, file_mas[b]*304 + buf+72)<=0) { file_mas[i] >< file_mas[j];   i++;}
23
	Sort_by_Name(a, i-2);
24
	Sort_by_Name(i, b);
25
}
26
 
27
 
976 leency 28
/*int partition1(dword a, b)
975 leency 29
{
30
	dword i = a; byte filename1[256], filename2[256]; int n;
31
	for (j = a; j <= b; j++)
32
	{
33
	    //
34
		copystr(file_mas[j]*304 + buf+72, #filename1);
35
		copystr(file_mas[b]*304 + buf+72, #filename2);
36
		n=strlen(#filename1)-1;
37
		WHILE (filename1[n]<>'.') && (n>0) n--;
38
		IF (n) copystr(#filename1+n+1, #filename1);
39
		n=strlen(#filename2)-1;
40
		WHILE (filename2[n]<>'.') && (n>0) n--;
41
		IF (n) copystr(#filename2+n+1, #filename2);
42
		//
43
		n=strcmp(#filename1, #filename2);
44
		IF (n<0) { file_mas[i] >< file_mas[j];   i++;}
45
		IF (n==0) && (strcmp(file_mas[j]*304 + buf+72, file_mas[b]*304 + buf+72)<=0) { file_mas[i] >< file_mas[j];   i++;}
46
	}
47
	EAX = i-1;
976 leency 48
}*/
49
 
50
int partition1(dword a, b)
51
{
52
	dword i = a; byte filename1[256], filename2[256]; int n;
53
	dword offset=buf+72;
54
	for (j = a; j <= b; j++)
55
	{
56
	    //
57
		copystr(file_mas[j]*304 + offset, #filename1);
58
		copystr(file_mas[b]*304 + offset, #filename2);
59
		n=strlen(#filename1)-1;
60
		WHILE (filename1[n]<>'.') && (n>0) n--;
61
		IF (n) copystr(#filename1+n+1, #filename1);
62
		n=strlen(#filename2)-1;
63
		WHILE (filename2[n]<>'.') && (n>0) n--;
64
		IF (n) copystr(#filename2+n+1, #filename2);
65
		//
66
		n=strcmp(#filename1, #filename2);
67
		IF (n<0) { file_mas[i] >< file_mas[j];   i++;}
68
		IF (n==0) && (strcmp(file_mas[j]*304 + offset, file_mas[b]*304 + offset)<=0) { file_mas[i] >< file_mas[j];   i++;}
69
	}
70
	EAX = i-1;
975 leency 71
}
72
 
73
void Sort_by_Type(dword a, b)   // для первого вызова: a = 0, b = <элементов в массиве> - 1
74
{
75
	int c;
76
	IF (a >= b) RETURN;
77
	c = partition1(a, b);
78
	Sort_by_Type(a, c-1);
79
	Sort_by_Type(c+1, b);
80
}
81