porky008 said:
I am having some difficulty with the bubble sort algorithm. Can
some one give me a better example than this one?
Here's four variations on bubblesort with a qsort interface:
/* bbsort, too simple bubblesort */
/* b0sort, very simple bubblesort */
/* b_sort, bubblesort */
/* c_sort, cocktail shaker bubblesort */
#define BYTE_SWAP(A, B) \
{ \
p1 = (A); \
p2 = (B); \
end = p2 + size; \
do { \
swap = *p1; \
*p1++ = *p2; \
*p2++ = swap; \
} while (p2 != end); \
}
void bbsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
unsigned char *last, *middle;
unsigned char *p1, *p2, *end, swap;
if (nmemb-- > 1) {
last = base;
last += nmemb * size;
do {
middle = base;
do {
if (compar(middle, middle + size) > 0) {
BYTE_SWAP(middle, middle + size);
}
middle += size;
} while (middle != last);
} while (--nmemb != 0);
}
}
void b0sort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
unsigned char *last, *middle;
unsigned char *p1, *p2, *end, swap;
if (nmemb-- > 1) {
last = base;
last += nmemb * size;
do {
middle = base;
do {
if (compar(middle, middle + size) > 0) {
BYTE_SWAP(middle, middle + size);
}
middle += size;
} while (middle != last);
last -= size;
} while (--nmemb != 0);
}
}
void b_sort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
unsigned char *last, *next, *middle;
unsigned char *p1, *p2, *end, swap;
if (nmemb-- > 1) {
last = base;
last += nmemb * size;
do {
middle = next = base;
do {
if (compar(middle, middle + size) > 0) {
BYTE_SWAP(middle, middle + size);
next = middle;
}
middle += size;
} while (middle != last);
last = next;
} while (last != base);
}
}
void c_sort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
unsigned char *last, *next, *middle;
unsigned char *p1, *p2, *end, swap;
if (nmemb-- > 1) {
next = base;
next += nmemb * size;
do {
middle = last = next;
do {
if (compar(middle - size, middle) > 0) {
BYTE_SWAP(middle - size, middle);
next = middle;
}
middle -= size;
} while (middle != base);
if (last == next) {
break;
}
middle = base = next;
do {
if (compar(middle, middle + size) > 0) {
BYTE_SWAP(middle, middle + size);
next = middle;
}
middle += size;
} while (middle != last);
} while (base != next);
}
}