Changeset 8e3fb24c in mainline


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

Copyright notice and proper tabs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/lib/sort.c

    r3156582 r8e3fb24c  
     1/*
     2 * Copyright (C) 2005 Sergey Bondari
     3 * All rights reserved.
     4 *
     5 * Redistribution and use in source and binary forms, with or without
     6 * modification, are permitted provided that the following conditions
     7 * are met:
     8 *
     9 * - Redistributions of source code must retain the above copyright
     10 *   notice, this list of conditions and the following disclaimer.
     11 * - Redistributions in binary form must reproduce the above copyright
     12 *   notice, this list of conditions and the following disclaimer in the
     13 *   documentation and/or other materials provided with the distribution.
     14 * - The name of the author may not be used to endorse or promote products
     15 *   derived from this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28
    129#include <mm/heap.h>
    230#include <memstr.h>
     
    533
    634void 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);
    739
    8     if (n > 4) {
    9         int i = 0, j = n - 1;
    10         void * tmp = (void *) malloc(e_size);
    11         void * pivot = (void *) malloc(e_size);
     40                memcpy(pivot, data, e_size);
    1241
    13         memcpy(pivot, data, e_size);
     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                }
    1453
    15         while (1) {
    16             while ((cmp(data + i * e_size, pivot) < 0) && i < n) i++;
    17             while ((cmp(data + j * e_size, pivot) >=0) && j > 0) j--;
     54                free(tmp);
     55                free(pivot);
    1856
    19             if (i<j) {
    20                 memcpy(tmp, data + i * e_size, e_size);
    21                 memcpy(data + i * e_size, data + j * e_size, e_size);
    22                 memcpy(data + j * e_size, tmp, e_size);
    23             } else {
    24                 break;
    25             }
    26         }
    27 
    28         free(tmp);
    29         free(pivot);
    30 
    31         qsort(data, j + 1, e_size, cmp);
    32         qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp);
    33 
    34     } else {
    35         bubblesort(data, n, e_size, cmp);
    36     }
    37 
    38 
     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        }
    3962}
    4063
    4164
    4265void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) {
    43     bool done = false;
    44     void * p;
    45     void * slot = (void *) malloc(e_size);
     66        bool done = false;
     67        void * p;
     68        void * slot = (void *) malloc(e_size);
    4669
    47     while (!done) {
    48         done = true;
    49         for (p = data; p < data + e_size * (n - 1); p = p + e_size) {
    50             if (cmp(p, p + e_size) == 1) {
    51                 memcpy(slot, p, e_size);
    52                 memcpy(p, p + e_size, e_size);
    53                 memcpy(p + e_size, slot, e_size);
    54                 done = false;
    55             }
    56         }
    57 
    58     }
    59 
    60     free(slot);
     70        while (!done) {
     71                done = true;
     72                for (p = data; p < data + e_size * (n - 1); p = p + e_size) {
     73                        if (cmp(p, p + e_size) == 1) {
     74                                memcpy(slot, p, e_size);
     75                                memcpy(p, p + e_size, e_size);
     76                                memcpy(p + e_size, slot, e_size);
     77                                done = false;
     78                        }
     79                }
     80        }
     81       
     82        free(slot);
    6183}
    6284
     
    6587 */
    6688int int_cmp(void * a, void * b) {
    67     return (* (int *) a > * (int*)b) ? 1 : (*(int *)a < * (int *)b) ? -1 : 0;
     89        return (* (int *) a > * (int*)b) ? 1 : (*(int *)a < * (int *)b) ? -1 : 0;
    6890}
    6991
    7092int __u8_cmp(void * a, void * b) {
    71     return (* (__u8 *) a > * (__u8 *)b) ? 1 : (*(__u8 *)a < * (__u8 *)b) ? -1 : 0;
     93        return (* (__u8 *) a > * (__u8 *)b) ? 1 : (*(__u8 *)a < * (__u8 *)b) ? -1 : 0;
    7294}
    7395
    7496int __u16_cmp(void * a, void * b) {
    75     return (* (__u16 *) a > * (__u16 *)b) ? 1 : (*(__u16 *)a < * (__u16 *)b) ? -1 : 0;
     97        return (* (__u16 *) a > * (__u16 *)b) ? 1 : (*(__u16 *)a < * (__u16 *)b) ? -1 : 0;
    7698}
    7799
    78100int __u32_cmp(void * a, void * b) {
    79     return (* (__u32 *) a > * (__u32 *)b) ? 1 : (*(__u32 *)a < * (__u32 *)b) ? -1 : 0;
     101        return (* (__u32 *) a > * (__u32 *)b) ? 1 : (*(__u32 *)a < * (__u32 *)b) ? -1 : 0;
    80102}
    81103
Note: See TracChangeset for help on using the changeset viewer.