Changeset f2460a50 in mainline for kernel/generic/src/lib/gsort.c
- Timestamp:
- 2017-05-30T06:16:25Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c726209
- Parents:
- 719a208
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/lib/gsort.c
r719a208 rf2460a50 27 27 */ 28 28 29 /** @addtogroup generic29 /** @addtogroup libc 30 30 * @{ 31 31 */ … … 40 40 */ 41 41 42 #include <gsort.h> 43 #include <memstr.h> 42 44 #include <mm/slab.h> 43 #include <memstr.h>44 #include <sort.h>45 45 46 46 /** Immediate buffer size. … … 77 77 78 78 while (i < cnt) { 79 if ((i >0) &&79 if ((i != 0) && 80 80 (cmp(INDEX(data, i, elem_size), 81 81 INDEX(data, i - 1, elem_size), arg) == -1)) { … … 90 90 } 91 91 92 /** Quicksort93 *94 * Apply generic quicksort algorithm on supplied data,95 * using pre-allocated buffers.96 *97 * @param data Pointer to data to be sorted.98 * @param cnt Number of elements to be sorted.99 * @param elem_size Size of one element.100 * @param cmp Comparator function.101 * @param arg 3rd argument passed to cmp.102 * @param slot Pointer to scratch memory buffer103 * elem_size bytes long.104 * @param pivot Pointer to scratch memory buffer105 * elem_size bytes long.106 *107 */108 static void _qsort(void *data, size_t cnt, size_t elem_size, sort_cmp_t cmp,109 void *arg, void *slot, void *pivot)110 {111 if (cnt > 4) {112 size_t i = 0;113 size_t j = cnt - 1;114 115 memcpy(pivot, data, elem_size);116 117 while (true) {118 while ((cmp(INDEX(data, i, elem_size), pivot, arg) < 0) && (i < cnt))119 i++;120 121 while ((cmp(INDEX(data, j, elem_size), pivot, arg) >= 0) && (j > 0))122 j--;123 124 if (i < j) {125 memcpy(slot, INDEX(data, i, elem_size), elem_size);126 memcpy(INDEX(data, i, elem_size), INDEX(data, j, elem_size),127 elem_size);128 memcpy(INDEX(data, j, elem_size), slot, elem_size);129 } else130 break;131 }132 133 _qsort(data, j + 1, elem_size, cmp, arg, slot, pivot);134 _qsort(INDEX(data, j + 1, elem_size), cnt - j - 1, elem_size,135 cmp, arg, slot, pivot);136 } else137 _gsort(data, cnt, elem_size, cmp, arg, slot);138 }139 140 92 /** Gnome sort wrapper 141 93 * … … 143 95 * allocations for storing the slot element for generic 144 96 * gnome sort algorithm. 145 *146 * This function can sleep.147 97 * 148 98 * @param data Pointer to data to be sorted. … … 175 125 } 176 126 177 /** Quicksort wrapper178 *179 * This is only a wrapper that takes care of memory180 * allocations for storing the pivot and temporary elements181 * for generic quicksort algorithm.182 *183 * This function can sleep.184 *185 * @param data Pointer to data to be sorted.186 * @param cnt Number of elements to be sorted.187 * @param elem_size Size of one element.188 * @param cmp Comparator function.189 * @param arg 3rd argument passed to cmp.190 *191 * @return True if sorting succeeded.192 *193 */194 bool qsort(void *data, size_t cnt, size_t elem_size, sort_cmp_t cmp, void *arg)195 {196 uint8_t ibuf_slot[IBUF_SIZE];197 uint8_t ibuf_pivot[IBUF_SIZE];198 void *slot;199 void *pivot;200 201 if (elem_size > IBUF_SIZE) {202 slot = (void *) malloc(elem_size, 0);203 if (!slot)204 return false;205 206 pivot = (void *) malloc(elem_size, 0);207 if (!pivot) {208 free(slot);209 return false;210 }211 } else {212 slot = (void *) ibuf_slot;213 pivot = (void *) ibuf_pivot;214 }215 216 _qsort(data, cnt, elem_size, cmp, arg, slot, pivot);217 218 if (elem_size > IBUF_SIZE) {219 free(pivot);220 free(slot);221 }222 223 return true;224 }225 226 127 /** @} 227 128 */
Note:
See TracChangeset
for help on using the changeset viewer.