Beispiel #1
0
void List::qs_sort(int p, int r, sort_t order)
{
  // Implement quicksort algorithm.  The list is sorted in place.

  // Returns: Nothing.

#if defined(DEBUG)
  dlog->log_entry(DEBUG_MINTRC, "List::qs_sort(%d,%d,%d)", p, r, order);
#endif

  // It would probably make sense to use STL's sort or something, but
  // that would require a fair amount of rewriting.  Array.C does
  // something similar.
  
  if(p < r)
  {
    int q = qs_partition(p, r, order);
    qs_sort(p, q, order);
    qs_sort(q+1, r, order);
  }

#if defined(DEBUG)
  dlog->log_exit(DEBUG_MINTRC, "List::qs_sort()");
#endif
}
Beispiel #2
0
static void qs_sort (void* items, int item_size, int l, int r, compare_proc proc, void* user_data)
{
   if (l < r)
   {
      int index = qs_partition(items, item_size, l, r, proc, user_data);
      qs_sort(items, item_size, l, index - 1, proc, user_data);
      qs_sort(items, item_size, index + 1, r, proc, user_data);
   }
}
Beispiel #3
0
bool List::sort(sort_t order)
{
  // Sort the contents of the list according to <order>.

  // Returns: True if fully successful, false otherwise.

  bool ret = false;
  
#if defined(DEBUG)
  dlog->log_entry(DEBUG_MINTRC, "List::sort(%d)", order);
#endif

  qs_sort(0, size-1, order);

  // Regenerate commaline

  xdelete(commaline);

  for(int i = 0;i < size;i++)
  {
    if(i > 0)
      commaline = xstrcat(commaline, ",");
    
    commaline = xstrcat(commaline, items[i]);
  }
  
  ret = true;

#if defined(DEBUG)
  dlog->log_exit(DEBUG_MINTRC, "List::sort = %s", IOTF(ret));
#endif

  return(ret);
}
Beispiel #4
0
int quicksort(void* items, int item_size, int ncount, compare_proc proc, void* user_data)
{
   if (items == NULL || proc == NULL || item_size == 0)
      return ERR_INVALIDARG;

   if (ncount < 2)
      return ERR_OK;

   qs_sort(items, item_size, 0, ncount - 1, proc, user_data);
   return ERR_OK;
}
Beispiel #5
0
extern char *
qs_sort_copy(const char *url)
{
    if (url == NULL) {
        errno = EFAULT;
        return NULL;
    }

    char *sorted_url = malloc(strlen(url) + 1);

    if (sorted_url == NULL) {
        return NULL;
    }

    if (qs_sort(url, sorted_url) != QS_OK) {
        free(sorted_url);
        return NULL;
    }

    return sorted_url;
}