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 | |
---|
18 | char *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 | |
---|
49 | char *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 | } |
---|