#include "Sorting.h"
typedef struct
{
void *context;
SDSortCompareCallback *comp;
SDSortSwapCallback *swap;
} SDSort;
int Sorting_isSorted(SDSort *self, int size);
void Sorting_quickSort(SDSort *self, int lb, int ub);
int Sorting_quickSortRearrange(SDSort *self, int lb, int ub);
//void Sorting_shellSort(SDSort *self, int size);
void Sorting_context_comp_swap_size_type_(void *context,
SDSortCompareCallback *comp,
SDSortSwapCallback *swap,
int size,
SDSortType type)
{
SDSort q;
SDSort *self = &q;
self->context = context;
self->comp = comp;
self->swap = swap;
switch (type)
{
case SDQuickSort:
if (!Sorting_isSorted(self, size)) Sorting_quickSort(self, 0, size-1);
break;
/*
case SDShellSort:
if (!Sorting_isSorted(self, size)) Sorting_shellSort(self, size);
break;
*/
}
}
int Sorting_isSorted(SDSort *self, int size)
{
SDSortCompareCallback *comp = self->comp;
void *context = self->context;
int i;
for (i = 0; i < size - 2; i ++)
{
if ((*comp)(context, i, i + 1) > 0)
{
return 0;
}
}
return 1;
}
void Sorting_quickSort(SDSort *self, int lb, int ub)
{
if (lb < ub)
{
int j = Sorting_quickSortRearrange(self, lb,ub);
if (j)
{
Sorting_quickSort(self, lb, j - 1);
}
Sorting_quickSort(self, j + 1, ub);
}
}
int Sorting_quickSortRearrange(SDSort *self, int lb, int ub)
{
SDSortCompareCallback *comp = self->comp;
SDSortSwapCallback *swap = self->swap;
void *context = self->context;
do {
while (ub > lb && (*comp)(context, ub, lb) >= 0)
{
ub --;
}
if (ub != lb)
{
(*swap)(context, ub, lb);
while (lb < ub && (*comp)(context, lb, ub) <= 0)
{
lb ++;
}
if (lb != ub)
{
(*swap)(context, lb, ub);
}
}
} while (lb != ub);
return lb;
}
/*
void Sorting_shellSort(SDSort *self, int size)
{
SDSortCompareCallback *comp = self->comp;
SDSortSwapCallback *swap = self->swap;
void *context = self->context;
int m = size;
while (m /= 2)
{
int k = size - m;
int j = 1;
do
{
int i = j;
do
{
int h = i + m;
if ((*comp)(context, i - 1, h - 1) > 0)
{
(*swap)(context, i - 1, h - 1);
i -= m;
}
else
{
break;
}
} while (i >= 1);
j += 1;
} while(j <= k);
}
}
*/
syntax highlighted by Code2HTML, v. 0.9.1