Changeset 788ccb04 in mainline
- Timestamp:
- 2005-09-11T13:38:48Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 272f4271
- Parents:
- ddd9486
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/lib/sort.c
rddd9486 r788ccb04 30 30 #include <memstr.h> 31 31 #include <sort.h> 32 #include <panic.h> 32 33 34 static void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void * pivot, void * tmp); 33 35 36 /* 37 * Wrapper method for quicksort algorithm to decrease amount of allocations 38 */ 34 39 void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) { 35 if (n > 4) { 36 int i = 0, j = n - 1; 37 void * tmp = (void *) malloc(e_size); 38 void * pivot = (void *) malloc(e_size); 40 void * tmp = (void *) malloc(e_size); 41 void * pivot = (void *) malloc(e_size); 42 43 if (!tmp || !pivot) { 44 panic("qsort(): Cannot allocate memory\n"); 45 } 39 46 40 memcpy(pivot, data, e_size); 41 42 while (1) { 43 while ((cmp(data + i * e_size, pivot) < 0) && i < n) i++; 44 while ((cmp(data + j * e_size, pivot) >=0) && j > 0) j--; 45 if (i<j) { 46 memcpy(tmp, data + i * e_size, e_size); 47 memcpy(data + i * e_size, data + j * e_size, e_size); 48 memcpy(data + j * e_size, tmp, e_size); 49 } else { 50 break; 51 } 52 } 53 54 free(tmp); 55 free(pivot); 56 57 qsort(data, j + 1, e_size, cmp); 58 qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp); 59 } else { 60 bubblesort(data, n, e_size, cmp); 61 } 47 _qsort(data, n, e_size, cmp, pivot, tmp); 48 49 free(tmp); 50 free(pivot); 62 51 } 63 52 … … 83 72 } 84 73 74 static void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void * pivot, void * tmp) { 75 if (n > 4) { 76 int i = 0, j = n - 1; 77 78 memcpy(pivot, data, e_size); 79 80 while (1) { 81 while ((cmp(data + i * e_size, pivot) < 0) && i < n) i++; 82 while ((cmp(data + j * e_size, pivot) >=0) && j > 0) j--; 83 if (i<j) { 84 memcpy(tmp, data + i * e_size, e_size); 85 memcpy(data + i * e_size, data + j * e_size, e_size); 86 memcpy(data + j * e_size, tmp, e_size); 87 } else { 88 break; 89 } 90 } 91 92 qsort(data, j + 1, e_size, cmp); 93 qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp); 94 } else { 95 bubblesort(data, n, e_size, cmp); 96 } 97 } 98 99 100 85 101 /* 86 102 * Comparator returns 1 if a > b, 0 if a == b, -1 if a < b
Note:
See TracChangeset
for help on using the changeset viewer.