dankogai/c-bucketsort
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
NAME bucketsort - bucket sort SYNOPSIS #include "bucketsort.h" int bucketsort( void **base, size_t nmemb, keyaccessor_t key, indexer_t idx, comparator_t cmp ); DESCRIPTION The bucketsort() is an implementations of bucket sort. base The reference to the array of pointers to the element (or integers whose size equals to that of pointer) to be sorted in-place. nmemb The nember of elements in the array. key The function pointer which takes the reference to the array element and returns the reference to the key. void *key(void *element); When "NULL" the default function is used which is defined as: inline void *identity(void *v) { return v; } idx The function pointer which takes the reference to the key and the recursion level of the caller and returns the integer value between 0 and 255, which is the bucket id. When "NULL" the default function is used which is defined as: inline int charAt(void *v, size_t i) { char *s = (char *) v; return s ? strlen(s) > i ? s[i] : 0 : 0; }; In other words, default acts the same as the MSD radix sort with variable lengths. cmp The Function pointer which compares two keys. This is needed to allow elements with same keys. Its signature is the same as the one you pass to "qsort()", "mergesort()" and "heapsort()" in libc. When "NULL", it defaults to: inline int stringcmp(void *a, void *b) { return strcmp(a ? a : "", b ? b : ""); } EXAMPLE See main.c which is included in the distro. IMPLEMENTATION DETAILS The bucket is implemented as a queue by linked lists. The whole array is converted to the linked list before sorted then written back to the array. If you like you can use the list sorter directly as: list_t bucketsort_l( list_t src, size_t nmemb, keyaccessor_t key indexer_t idx, comparator_t cmp ); where: typedef struct { void *car, *cdr; } _cons_t, *list_t; ACHILLES'S HEEL AND ITS SHIELD The obvious drawback of the recursive bucket sort is that it recurses deeply when it comes accross data (strings) with long common prefix. Given: aa..a # "a" x n aa..aa # "a" x (n+1) It recurses n times. To cope with such cases, "bucketsort()" now falls back to the merge sort after "BUCKETSORT_DEPTH", 256 in bucketsort.h. The merge sort used there is defined as: list_t mergesort_l( list_t src, comparator_t cmp ); RETURN VALUES The bucketsort() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error. ERRORS ENOMEM When "bucketsort()" fails to allocate the memory needed to build the list, which is exactly twice the size of the original array since each element takes two pointers. SEE ALSO sort(3), qsort(3), megesort(3), heapsort(3), radixsort(3) <http://en.wikipedia.org/wiki/Bucket_sort> Engineering Radix Sort <http://usenix.org/publications/compsystems/1993/win_mcilroy.pdf> Consequently this program is a generalized verion of the Program A in the paper. Their program (and radixsort(1) in 4.4 BSD) is by limiting its application to string sorting.
About
bucketsort - bucket sort that can be used for general purpose
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published