source: tags/initial/ARBDB/adsort.c

Last change on this file was 2, checked in by oldcode, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.0 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <malloc.h>
4#include <memory.h>
5
6#include "arbdb.h"
7#include "arbdbt.h"
8
9/* sort an array
10        compare is a compare function:
11
12        compare(2,3) should be  <0;
13        compare(x,x)            = 0;
14        compare(4,3)            >0;
15
16*/
17
18char *GBT_quicksort(void **array,long start, long end, gb_compare_two_items_type compare, char *client_data)
19{
20    long        i,j;
21    long        mid;
22    void        *swap;
23    char        *error;
24    if (end-1 <= start) return 0;
25    i = start;
26    j = end-1;
27    mid = (i+j)/2;
28    while (i<j) {
29        for (; i<j; i++) {
30            if (compare(array[i],array[mid],client_data) >= 0) break;
31        }
32        for (;  i<j; j--) {
33            if (compare(array[j],array[mid],client_data) < 0) break;
34        }
35        swap = array[i];
36        array[i] = array[j];
37        array[j] = swap;
38        if (i== mid) mid = j;
39        else if (j== mid) mid = i;
40    }
41    swap = array[i];
42    array[i] = array[mid];
43    array[mid] = swap;
44    error = GBT_quicksort(array,start,i,compare,client_data);
45    if (!error) error = GBT_quicksort(array,i+1,end,compare,client_data);
46    return error;
47}
48
49char *GB_mergesort(void **array,long start, long end, gb_compare_two_items_type compare, char *client_data)
50{
51    long size;
52    long mid;
53    long i, j;
54    long        dest;
55    void **buffer;
56    void *ibuf[256];
57    char *error;
58
59    size = end - start;
60    if (size <= 1) {
61        return 0;
62    }
63    mid = (start+end) / 2;
64    error = GB_mergesort(array,start,mid,compare,client_data);
65    error = GB_mergesort(array,mid,end,compare,client_data);
66    if (size <256) {
67        buffer = ibuf;
68    }else {
69        buffer = (void **)malloc((size_t)(size * sizeof(void *)));
70    }
71
72    for ( dest = 0, i = start, j = mid ; i< mid && j < end;) {
73        if (compare(array[i],array[j],client_data) < 0) {
74            buffer[dest++] = array[i++];
75        }else{
76            buffer[dest++] = array[j++];
77        }
78    }
79    while(i<mid) buffer[dest++] = array[i++];
80    while(j<end) buffer[dest++] = array[j++];
81   
82    memcpy( (char *)(array+start),(char *)buffer,(int)size * sizeof(void *));
83   
84    if (size>=256) free((char *)buffer);
85   
86    return error;
87}
Note: See TracBrowser for help on using the repository browser.