Algorithm-MedianSelect-XS
view release on metacpan or search on metacpan
#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 )