KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hsqldb > lib > Sort


1 /* Copyright (c) 1995-2000, The Hypersonic SQL Group.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of the Hypersonic SQL Group nor the names of its
15  * contributors may be used to endorse or promote products derived from this
16  * software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
22  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  * This software consists of voluntary contributions made by many individuals
31  * on behalf of the Hypersonic SQL Group.
32  *
33  *
34  * For work added by the HSQL Development Group:
35  *
36  * Copyright (c) 2001-2005, The HSQL Development Group
37  * All rights reserved.
38  *
39  * Redistribution and use in source and binary forms, with or without
40  * modification, are permitted provided that the following conditions are met:
41  *
42  * Redistributions of source code must retain the above copyright notice, this
43  * list of conditions and the following disclaimer.
44  *
45  * Redistributions in binary form must reproduce the above copyright notice,
46  * this list of conditions and the following disclaimer in the documentation
47  * and/or other materials provided with the distribution.
48  *
49  * Neither the name of the HSQL Development Group nor the names of its
50  * contributors may be used to endorse or promote products derived from this
51  * software without specific prior written permission.
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
54  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56  * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
57  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
58  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
59  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
60  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
61  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
63  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64  */

65
66
67 package org.hsqldb.lib;
68
69 public class Sort {
70
71     /**
72      * FastQSorts the [l,r] partition (inclusive) of the specfied array of
73      * Rows, using the comparator.
74      *
75      * Modified from the original method in Hypersonic with the addition of
76      * the comparator. (fredt@users)
77      *
78      * @author Thomas Mueller (Hypersonic SQL Group)
79      * @version 1.7.2
80      * @since 1.7.2
81      */

82     public static final void sort(Object JavaDoc[] w, ObjectComparator comparator,
83                                   int l, int r) {
84
85         int i;
86         int j;
87         Object JavaDoc p;
88
89         if (l > r) {
90             return;
91         }
92
93         while (r - l > 10) {
94             i = (r + l) >> 1;
95
96             if (comparator.compare(w[l], w[r]) > 0) {
97                 swap(w, l, r);
98             }
99
100             if (comparator.compare(w[i], w[l]) < 0) {
101                 swap(w, l, i);
102             } else if (comparator.compare(w[i], w[r]) > 0) {
103                 swap(w, i, r);
104             }
105
106             j = r - 1;
107
108             swap(w, i, j);
109
110             p = w[j];
111             i = l;
112
113             while (true) {
114                 while (comparator.compare(w[++i], p) < 0) {
115                     ;
116                 }
117
118                 while (comparator.compare(w[--j], p) > 0) {
119                     ;
120                 }
121
122                 if (i >= j) {
123                     break;
124                 }
125
126                 swap(w, i, j);
127             }
128
129             swap(w, i, r - 1);
130             sort(w, comparator, l, i - 1);
131
132             l = i + 1;
133         }
134
135         for (i = l + 1; i <= r; i++) {
136             Object JavaDoc t = w[i];
137
138             for (j = i - 1; j >= l && comparator.compare(w[j], t) > 0; j--) {
139                 w[j + 1] = w[j];
140             }
141
142             w[j + 1] = t;
143         }
144     }
145
146     /**
147      * Swaps the a'th and b'th elements of the specified Row array.
148      */

149     private static void swap(Object JavaDoc[] w, int a, int b) {
150
151         Object JavaDoc t = w[a];
152
153         w[a] = w[b];
154         w[b] = t;
155     }
156
157     public static class StringComparator implements ObjectComparator {
158
159         public int compare(Object JavaDoc a, Object JavaDoc b) {
160
161             // handle nulls
162
if (a == b) {
163                 return 0;
164             }
165
166             if (a == null) {
167                 return -1;
168             }
169
170             if (b == null) {
171                 return 1;
172             }
173
174             return ((String JavaDoc) a).compareTo((String JavaDoc) b);
175         }
176     }
177 }
178
Popular Tags