Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libvcodex/vcbcktsort.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2003-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Phong Vo <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "vchdr.h"
21
22
/* Counting bucket sort.
23
** Return the number of distinct bytes. The bckt[] argument returns
24
** the cumulative counts of all bytes. Thus, bckt[0] is the count
25
** of byte 0, bckt[1] is the cumulative count of 0 and 1, and so on.
26
**
27
** Written by Kiem-Phong Vo.
28
*/
29
30
#if __STD_C
31
ssize_t vcbcktsort(ssize_t* indx, ssize_t* list, ssize_t n, Vcchar_t* data, ssize_t* bckt)
32
#else
33
ssize_t vcbcktsort(indx, list, n, data, bckt)
34
ssize_t* indx; /* output sorted indxes */
35
ssize_t* list; /* indices to be sorted */
36
ssize_t n; /* # of indices */
37
Vcchar_t* data; /* data used to sort */
38
ssize_t* bckt; /* [256] buckets */
39
#endif
40
{
41
ssize_t i, p, c;
42
ssize_t distinct = 0;
43
44
/* count byte frequencies */
45
memset(bckt, 0, 256*sizeof(ssize_t));
46
if(list) /* sort using secondary predictor */
47
{ for(p = 0; p < n; ++p)
48
bckt[data[list[p]]] += 1;
49
}
50
else /* unsorted permutation was the identity */
51
{ for(p = 0; p < n; ++p)
52
bckt[data[p]] += 1;
53
}
54
55
for(p = 0, i = 0; i < 256; ++i) /* starting positions */
56
{ if((c = bckt[i]) > 0)
57
distinct += 1;
58
bckt[i] = p;
59
p += c;
60
}
61
62
if(list) /* sorting a sublist of indices */
63
{ for(p = 0; p < n; ++p)
64
indx[bckt[data[list[p]]]++] = list[p];
65
}
66
else /* sorting all indices */
67
{ for(p = 0; p < n; ++p)
68
indx[bckt[data[p]]++] = p;
69
}
70
71
return distinct;
72
}
73
74
75
#if 0
76
/* some intermediate versions of Vcodex used this implementation and became
77
** incompatible with earlier version of Vctable. So this is saved here in case
78
** we ever need to deal with data compressed with such versions.
79
*/
80
#if __STD_C
81
ssize_t vcbcktsort(ssize_t* sort, ssize_t* list, ssize_t n, Vcchar_t* data, ssize_t* bckt)
82
#else
83
ssize_t vcbcktsort(sort, list, n, data, bckt)
84
ssize_t* sort; /* to output sorted elements */
85
ssize_t* list; /* != NULL: list to be sorted */
86
/* == NULL: sorting 0,1,...n-1 */
87
ssize_t n; /* # of elements to be sorted */
88
Vcchar_t* data; /* data identifying elements */
89
ssize_t* bckt; /* temp space of [256] buckets */
90
#endif
91
{
92
ssize_t p, i, c, minc, maxc;
93
ssize_t distinct = 0;
94
95
/* count byte frequencies */
96
memset(bckt, 0, 256*sizeof(ssize_t));
97
minc = 256; maxc = -1;
98
for(p = 0; p < n; ++p)
99
{ c = data[list ? list[p] : p];
100
minc = c < minc ? c : minc;
101
maxc = c > maxc ? c : maxc;
102
bckt[c] += 1;
103
}
104
105
/* set starting positions for each bucket */
106
for(p = 0, c = minc; c <= maxc; ++c)
107
{ if((i = bckt[c]) <= 0)
108
continue;
109
distinct += 1; /* count distinct letters */
110
bckt[c] = p; p += i;
111
}
112
113
/* now sort them into place */
114
for(p = 0; p < n; ++p)
115
{ i = list ? list[p] : p;
116
sort[bckt[data[i]]++] = i;
117
}
118
119
return distinct;
120
}
121
#endif
122
123