Changeset 788ccb04 in mainline


Ignore:
Timestamp:
2005-09-11T13:38:48Z (19 years ago)
Author:
Sergey Bondari <bondari@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
272f4271
Parents:
ddd9486
Message:

More effective memory allocations with help of qsort wrapper method

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/lib/sort.c

    rddd9486 r788ccb04  
    3030#include <memstr.h>
    3131#include <sort.h>
     32#include <panic.h>
    3233
     34static void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void * pivot, void * tmp);
    3335
     36/*
     37 * Wrapper method for quicksort algorithm to decrease amount of allocations
     38 */
    3439void 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        }
    3946
    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);
    6251}
    6352
     
    8372}
    8473
     74static 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
    85101/*
    86102 * Comparator returns 1 if a > b, 0 if a == b, -1 if a < b
Note: See TracChangeset for help on using the changeset viewer.