Algorithm-MedianSelect-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#define croak_msg(msg) \
    croak ("median(): %s", msg)
#define croak_msg_internal(msg) \
    croak ("median(): internal error: %s", msg)

enum { LESS_THAN = -1, EQUAL_TO, GREATER_THAN };

static int
quick_sort (const void *arg1, const void *arg2)
{
    const long num1 = *(long *)arg1, num2 = *(long *)arg2;
    if (num1 < num2)
      return LESS_THAN;
    else if (num1 == num2)
      return EQUAL_TO;
    else if (num1 > num2)
      return GREATER_THAN;
    else
      croak_msg_internal ("quick sort did not return a long integer");
}

#define SWAP(num_curr, num_next) \
    const long tmp = num_curr;   \
    num_curr = num_next;         \
    num_next = tmp;

static void
bubble_sort (long *numbers, unsigned int realitems)
{
    bool sort;

    do
      {
        unsigned int i;
        sort = FALSE;
        for (i = 0; i < (realitems - 1); i++)
          {
            if (i >= 1
            && (numbers[i - 1] <= numbers[i]) && (numbers[i] <= numbers[i + 1]))
              continue; /* optimization */
            else if (numbers[i] > numbers[i + 1])
              {
                SWAP (numbers[i], numbers[i + 1]);
                sort = TRUE;
              }
          }
      }
    while (sort);
}

MODULE = Algorithm::MedianSelect::XS        PACKAGE = Algorithm::MedianSelect::XS

void
xs_median (...)
    PROTOTYPE: @\@
    INIT:
      long *numbers = NULL;
      unsigned int median, realitems;
      enum { BUBBLE_SORT = 1, QUICK_SORT };
    PPCODE:
      if (items == 1)
        {
          if (SvROK (ST(0)))
            {



( run in 0.992 second using v1.01-cache-2.11-cpan-df04353d9ac )