Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Quriosity: SLOW way to sort :-)

Author: Dann Corbit

Date: 13:37:15 10/19/99

Go up one level in this thread


On October 19, 1999 at 15:20:26, J. Wesley Cleveland wrote:
[snip]
>I came up with an even slower sort.
>
>while (!sorted) ;
However, that algorithm never succeeds.  Bogosort provably does succeed, it just
takes a long, long time.  Here it is, for those interested in the macabe:

/* A BogoSort(tm) implementation bsort(), like qsort()
   Public domain by Tom Torfs
   Define TEST for a demonstration */

#include <stdlib.h>
#include <time.h>

/* This BogoSort(tm) routine performs very
   well for an already sorted set of data */
void bsort(void *base,
           size_t nmemb,
           size_t size,
           int (*compar)(const void *, const void *))
{
   static int seeded = 0;
   size_t elem1, elem2;
   size_t count;
   unsigned char temp;
   unsigned char *cbase = base;
   int sorted;

   /* seed PRNG if first call */
   if (!seeded)
   {
      srand((unsigned)time(NULL));
      seeded = 1;
   }

   /* less than 2 elements are always sorted */
   if (nmemb < 2)
      return;

   for (;;)
   {
      /* check if sorted */
      sorted = 1;
      for (elem1=0; elem1<nmemb-1; elem1++)
      {
         if (compar((const void *)(cbase+elem1*size),
                    (const void *)(cbase+(elem1+1)*size)) > 0)
         {
            sorted = 0;
            break;
         }
      }

      if (sorted)
         return;

      /* not sorted yet, generate a random permutation */
      for (elem1=0; elem1<nmemb; elem1++)
      {
         elem2 = rand() / (RAND_MAX / nmemb + 1);
         /* swap elem1 and elem2 bytewise */
         for (count=0; count<size; count++)
         {
            temp = cbase[elem1*size + count];
            cbase[elem1*size + count] = cbase[elem2*size + count];
            cbase[elem2*size + count] = temp;
         }
      }
   }
}

#ifdef TEST

#include <stdio.h>

int intcmp(const void *a, const void *b)
{
   int x = *(const int *)a;
   int y = *(const int *)b;
   return (x > y) - (x < y);
}

int main(void)
{
   char buf[10];
   int *array;
   int n, count;

   puts("BogoSort(tm) demonstration\n");

   do
   {
      printf("How many elements to sort ? ");
      fflush(stdout);
   }
   while (fgets(buf, sizeof buf, stdin)==NULL
          || sscanf(buf, "%d", &n)!=1
          || n<0);

   array = malloc(sizeof *array * n);

   if (array==NULL)
   {
      printf("Out of memory.");
      return EXIT_FAILURE;
   }

   puts("Enter data to be sorted:");

   for (count=0; count<n; count++)
   {
      do
      {
         printf("Enter value for element number %5d: ", count);
         fflush(stdout);
      }
      while (fgets(buf, sizeof buf, stdin)==NULL
             || sscanf(buf, "%d", &array[count])!=1);
   }

   printf("Sorting...\n");
   bsort(array, n, sizeof *array, intcmp);

   printf("Results:\n");
   for (count=0; count<n; count++)
      printf("Element number %5d: %5d\n", count, array[count]);

   return EXIT_SUCCESS;
}

#endif



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.