Changeset 6799505 in mainline for src/lib/sort.c
- Timestamp:
- 2005-09-16T10:42:10Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a5556b4
- Parents:
- 0a50f59
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/lib/sort.c
r0a50f59 r6799505 34 34 #define EBUFSIZE 32 35 35 36 void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *tmp, void *pivot); 37 void _bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *slot); 38 39 /** Quicksort wrapper 40 * 41 * This is only a wrapper that takes care of memory allocations for storing 42 * the pivot and temporary elements for generic quicksort algorithm. 43 * 44 * @param data Pointer to data to be sorted. 45 * @param n Number of elements to be sorted. 46 * @param e_size Size of one element. 47 * @param cmp Comparator function. 48 * 49 */ 36 50 void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) 37 51 { … … 50 64 } 51 65 66 _qsort(data, n, e_size, cmp, tmp, pivot); 67 68 if (e_size > EBUFSIZE) { 69 free(tmp); 70 free(pivot); 71 } 72 } 73 74 /** Quicksort 75 * 76 * Apply generic quicksort algorithm on supplied data, using pre-allocated buffers. 77 * 78 * @param data Pointer to data to be sorted. 79 * @param n Number of elements to be sorted. 80 * @param e_size Size of one element. 81 * @param cmp Comparator function. 82 * @param tmp Pointer to scratch memory buffer e_size bytes long. 83 * @param pivot Pointer to scratch memory buffer e_size bytes long. 84 * 85 */ 86 void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *tmp, void *pivot) 87 { 52 88 if (n > 4) { 53 89 int i = 0, j = n - 1; … … 67 103 } 68 104 69 qsort(data, j + 1, e_size, cmp);70 qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp);105 _qsort(data, j + 1, e_size, cmp, tmp, pivot); 106 _qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp, tmp, pivot); 71 107 } else { 72 bubblesort(data, n, e_size, cmp); 73 } 74 75 76 if (e_size > EBUFSIZE) { 77 free(tmp); 78 free(pivot); 108 _bubblesort(data, n, e_size, cmp, tmp); 79 109 } 80 110 } 81 111 82 112 /** Bubblesort wrapper 113 * 114 * This is only a wrapper that takes care of memory allocation for storing 115 * the slot element for generic bubblesort algorithm. 116 * 117 * @param data Pointer to data to be sorted. 118 * @param n Number of elements to be sorted. 119 * @param e_size Size of one element. 120 * @param cmp Comparator function. 121 * 122 */ 83 123 void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) 84 124 { 85 125 __u8 buf_slot[EBUFSIZE]; 86 bool done = false;87 void * p;88 126 void * slot = buf_slot; 89 127 … … 95 133 } 96 134 } 135 136 _bubblesort(data, n, e_size, cmp, slot); 137 138 if (e_size > EBUFSIZE) { 139 free(slot); 140 } 141 } 142 143 /** Bubblesort 144 * 145 * Apply generic bubblesort algorithm on supplied data, using pre-allocated buffer. 146 * 147 * @param data Pointer to data to be sorted. 148 * @param n Number of elements to be sorted. 149 * @param e_size Size of one element. 150 * @param cmp Comparator function. 151 * @param slot Pointer to scratch memory buffer e_size bytes long. 152 * 153 */ 154 void _bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *slot) 155 { 156 bool done = false; 157 void * p; 97 158 98 159 while (!done) { … … 107 168 } 108 169 } 109 110 if (e_size > EBUFSIZE) { 111 free(slot); 112 } 170 113 171 } 114 172
Note:
See TracChangeset
for help on using the changeset viewer.