1 2 3 4 5 6 7 8 9 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 69 70 71 72
|
#include <stdio.h> #include <string.h>
static void Swap(char *vp1, char *vp2, int width) { char tmp;
if ( vp1 != vp2 ) { while ( width-- ) { tmp = *vp1; *vp1++ = *vp2; *vp2++ = tmp; } } }
void BubbleSort(void *base, int n, int elem_size, int (*compare)( void *, void * )) { int i, last, end = n - 1; char *elem_addr1, *elem_addr2;
while (end > 0) { last = 0; for (i = 0; i < end; i++) { elem_addr1 = (char *)base + i * elem_size; elem_addr2 = (char *)base + (i + 1) * elem_size; if (compare( elem_addr1, elem_addr2 ) > 0) { Swap(elem_addr1, elem_addr2, elem_size); last = i; } } end = last; } }
int compare_int(void *elem1, void *elem2) { return (*(int *)elem1 - *(int *)elem2); }
int compare_double(void *elem1, void *elem2) { return (*(double *)elem1 > *(double *)elem2) ? 1 : 0; }
int main(int argc, char *argv[]) { int num_int[8] = {8,7,6,5,4,3,2,1}; double num_double[8] = {8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1}; int i;
BubbleSort(num_int, 8, sizeof(int), compare_int);
for (i = 0; i < 8; i++) { printf("%d ", num_int[i]); }
printf("\n");
BubbleSort(num_double, 8, sizeof(double), compare_double);
for (i = 0; i < 8; i++) { printf("%.1f ", num_double[i]); }
return 0; }
|