Может тебе нужна сортировка данных?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =L.A.= 22 марта 2004 г. 16:43
В ответ на: для Vslav отправлено Garisoft 22 марта 2004 г. 16:35


типа вот этой?

/*
* Quicksort based on the algorithm given in
* "Algorithms + Data Structures = Programs" by N. Wirth.
*/

#include
#include

extern void _swap(unsigned, void *, void *);

void
qsort(void * vbase, size_t nel, size_t width, int (*compar)(const void *, const void *))
{
register char * base;
register char * x;
register int i,j,l,r;
int s;
#if i8051 && (SMALL_MODEL || MEDIUM_MODEL) || m6805
struct
{
int l,r;
} stack[5];
char xbuf[16];
#else
#if m6800
struct
{
int l,r;
} stack[5];
char xbuf[80];
#else
struct
{
int l,r;
} stack[16];
char xbuf[800];
#endif
#endif

base = vbase;
if(width < sizeof xbuf)
x = xbuf;
else if(!(x = malloc(width+1)))
return; /* can't do much */
x[width] = 0;
s = 0;
stack[0].l = 0;
stack[0].r = nel-1;
do {
/* take top request from stack */
l = stack[s].l;
r = stack[s--].r;

do {
i = l;
j = r;
memcpy(x, base+width*((i+j)/2), width);
do {
while((*compar)(base+i*width, x) < 0)
i++;
while((*compar)(x, base+j*width) < 0)
j--;
if(i <= j) {
_swap(width, base+i*width, base+j*width);
i++;
j--;
}
} while(i <= j);
if(j-l < r-i) {
if(i < r) { /* stack right partition */
stack[++s].l = i;
stack[s].r = r;
}
r = j; /* continue with left */
} else {
if(l < j) {
stack[++s].l = l;
stack[s].r = j;
}
l = i;
}
} while(l < r);
} while(s >= 0);
if(x != xbuf)
free(x);
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru