- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
char Sort(char Type, int l, int r)
{
int i = l, j = r;
char x[31];
void *y = 0;
setmem(x, 31, 0);
strcpy(x, ((TData*)(DataLists[CurrentList][(l+r)/2]))->Data[CurrentCol-1]);
do
{
if (Type==UP)
{
switch(CurrentCol)
{
case 1: case 2:
while (strcmp(((TData*)(DataLists[CurrentList][i]))->Data[CurrentCol-1], x) < 0)
++i;
while (strcmp(((TData*)(DataLists[CurrentList][j]))->Data[CurrentCol-1], x) > 0)
--j;
break;
default:
while (atoi(((TData*)(DataLists[CurrentList][i]))->Data[CurrentCol-1])<atoi(x))
++i;
while (atoi(((TData*)(DataLists[CurrentList][j]))->Data[CurrentCol-1])>atoi(x))
--j;
}
}
else
{
switch(CurrentCol)
{
case 1: case 2:
while (strcmp(((TData*)(DataLists[CurrentList][i]))->Data[CurrentCol-1], x) > 0)
++i;
while (strcmp(((TData*)(DataLists[CurrentList][j]))->Data[CurrentCol-1], x) < 0)
--j;
break;
default:
while (atoi(((TData*)(DataLists[CurrentList][i]))->Data[CurrentCol-1])>atoi(x))
++i;
while (atoi(((TData*)(DataLists[CurrentList][j]))->Data[CurrentCol-1])<atoi(x))
--j;
}//switch
}//if
if (i<=j)
{
y = DataLists[CurrentList][i];
*(DataLists[CurrentList].GetPointerToData(i)) = DataLists[CurrentList][j];
*(DataLists[CurrentList].GetPointerToData(j)) = y;
++i, --j;
}
}
while (i<=j);
if (l<j)
{
if (Type==UP)
Sort(UP, l, j);
else
Sort(DOWN, l, j);
}
if (i<r)
{
if (Type==UP)
Sort(UP, i, r);
else
Sort(DOWN, i, r);
}
return 1;
}
По-моему, это должна была быть сортировка Хоара, а получилось говно. Самое странное - это то, что оно работает...