Opgaver i denne lektion   Gå til annoteret slide, hvor denne opgave er tilknyttet -- Tastaturgenvej: 'u'   Alfabetisk indeks   Kursets hjemmeside   

Opgaveløsning:
bsort


Her et mit bud på en løsning. Programmet er skrevet så bsort er så genkendelig som mulig i forhold til det tidligere program, vi har set på.

Læg mærke til følgende:

Her er programmet:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(char *p, char *q, size_t size, char *temp){
   memcpy(temp, p, size);
   memcpy(p, q, size);
   memcpy(q, temp, size);
}

void bsort(void *base, size_t n, size_t size, int(*compar)(const void *, const void *)){
   int i, j;
   char *bbase = (char*)base,        /* base by byte */
        *tempspace = malloc(size),   /* temp space used by swap */
        *el_j_minus_1_ptr, *el_j_ptr;

   for (i = 0; i < n - 1; ++i){
     for (j = n - 1; j > i; --j){
       el_j_minus_1_ptr = bbase + (j-1) * size;  /* a pointer to element j   */
       el_j_ptr = bbase + j * size;              /* a pointer to element j-1 */
       if (compar((void*)el_j_minus_1_ptr, (void*)el_j_ptr) > 0)
          swap(el_j_minus_1_ptr, el_j_ptr, size, tempspace);
     }
   }
 
   free(tempspace);
}

void prn_array(char* s , const int a[] , int n){
   int   i;

   printf("\n    %s sorting:", s);
   for (i = 0; i < n; ++i)
      printf("%5d", a[i]);
   putchar('\n');
}

int int_compar(const void *ip1, const void *ip2){
  int result;
  int *ipi1 = (int *)ip1,    
      *ipi2 = (int *) ip2;

  if (*ipi1 < *ipi2)
     result = -1;
  else if (*ipi1 > *ipi2)
     result = 1;
  else
     result = 0;

  return result;
}

int main(void){
  int   a[] = {7, 3, 66, 3, -5, 22, -77, 2};
  int   n;

  n = sizeof(a) / sizeof(int);       
  prn_array("Before", a, n);
  bsort(a, n, sizeof(int), int_compar);
  prn_array(" After", a, n);
  putchar('\n');
  return 0;
}