[ create a new paste ] login | about

Link: http://codepad.org/bOyVeBKm    [ raw code | output | fork ]

C, pasted on Mar 10:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Qsort(void *base, int n, int size, int (*cmp)(const void *, const void *)) {
  int min, max;
  void *tmp, *idx;
  if (n <= 1)
    return;
  if ((idx = malloc(size)) == NULL)
    return;
  if ((tmp = malloc(size)) == NULL) {
    free(idx);
    return;
  }
  memcpy(idx, base, size);
  min = 1;
  max = n - 1;
  while (min <= max) {
    if ((*cmp)(idx, base + min * size) < 0) {
      memcpy(tmp, base + min * size, size);
      memcpy(base + min * size, base + max * size, size);
      memcpy(base + max * size, tmp, size);
      max--;
    } else {
      memcpy(base + (min - 1) * size, base + min * size, size);
      min++;
    }
  }
  memcpy(base + max * size, idx, size);
  if (min > 1) {
    Qsort(base, min - 1, size, (int (*)(const void *, const void *))cmp);
  }
  if (max < n - 1) {
    Qsort(base + (max + 1) * size, n - 1 - max, size, (int (*)(const void *, const void *))cmp);
  }  
  free(tmp);
  free(idx);
}

int cmp1(int *a, int *b) {
  return (*a == *b) ? 0 : (*a > *b) ? 1 : -1;
}

int cmp2(int *a, int *b) {
  return (*a == *b) ? 0 : (*a < *b) ? 1 : -1;
}

int main(void) {
  int i;
  int a[] = {3, 2, 4, 5, 6, 8, 7, 9, 1, 0 };
  int b[sizeof(a) / sizeof(a[0])];
  for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    printf("%d ", a[i]);
  putchar('\n');

  for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    b[i] = a[i];
  Qsort(b, sizeof(b) / sizeof(b[0]), sizeof(b[0]), (int (*)(const void *, const void *))cmp1);
  for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
    printf("%d ", b[i]);
  putchar('\n');

  for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    b[i] = a[i];
  Qsort(b, sizeof(b) / sizeof(b[0]), sizeof(b[0]), (int (*)(const void *, const void *))cmp2);
  for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
    printf("%d ", b[i]);
  putchar('\n');

  return 0;
}
/* end */


Output:
1
2
3
3 2 4 5 6 8 7 9 1 0 
0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0 


Create a new paste based on this one


Comments: