1 /*
2 * The Apache Software License, Version 1.1
3 *
4 * Copyright (c) 2003 The Apache Software Foundation. All rights
5 * reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
25 *
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
30 *
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
34 *
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46 * SUCH DAMAGE.
47 * ====================================================================
48 *
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
53 */
54 package net.sf.cglib.util;
55
56 import java.util.*;
57
58 abstract class SorterTemplate {
59 private static final int MERGESORT_THRESHOLD = 12;
60 private static final int QUICKSORT_THRESHOLD = 7;
61
62 abstract protected void swap(int i, int j);
63 abstract protected int compare(int i, int j);
64
65 protected void quickSort(int lo, int hi) {
66 quickSortHelper(lo, hi);
67 insertionSort(lo, hi);
68 }
69
70 private void quickSortHelper(int lo, int hi) {
71 for (;;) {
72 int diff = hi - lo;
73 if (diff <= QUICKSORT_THRESHOLD) {
74 break;
75 }
76 int i = (hi + lo) / 2;
77 if (compare(lo, i) > 0) {
78 swap(lo, i);
79 }
80 if (compare(lo, hi) > 0) {
81 swap(lo, hi);
82 }
83 if (compare(i, hi) > 0) {
84 swap(i, hi);
85 }
86 int j = hi - 1;
87 swap(i, j);
88 i = lo;
89 int v = j;
90 for (;;) {
91 while (compare(++i, v) < 0) {
92 /* nothing */;
93 }
94 while (compare(--j, v) > 0) {
95 /* nothing */;
96 }
97 if (j < i) {
98 break;
99 }
100 swap(i, j);
101 }
102 swap(i, hi - 1);
103 if (j - lo <= hi - i + 1) {
104 quickSortHelper(lo, j);
105 lo = i + 1;
106 } else {
107 quickSortHelper(i + 1, hi);
108 hi = j;
109 }
110 }
111 }
112
113 private void insertionSort(int lo, int hi) {
114 for (int i = lo + 1 ; i <= hi; i++) {
115 for (int j = i; j > lo; j--) {
116 if (compare(j - 1, j) > 0) {
117 swap(j - 1, j);
118 } else {
119 break;
120 }
121 }
122 }
123 }
124
125 protected void mergeSort(int lo, int hi) {
126 int diff = hi - lo;
127 if (diff <= MERGESORT_THRESHOLD) {
128 insertionSort(lo, hi);
129 return;
130 }
131 int mid = lo + diff / 2;
132 mergeSort(lo, mid);
133 mergeSort(mid, hi);
134 merge(lo, mid, hi, mid - lo, hi - mid);
135 }
136
137 private void merge(int lo, int pivot, int hi, int len1, int len2) {
138 if (len1 == 0 || len2 == 0) {
139 return;
140 }
141 if (len1 + len2 == 2) {
142 if (compare(pivot, lo) < 0) {
143 swap(pivot, lo);
144 }
145 return;
146 }
147 int first_cut, second_cut;
148 int len11, len22;
149 if (len1 > len2) {
150 len11 = len1 / 2;
151 first_cut = lo + len11;
152 second_cut = lower(pivot, hi, first_cut);
153 len22 = second_cut - pivot;
154 } else {
155 len22 = len2 / 2;
156 second_cut = pivot + len22;
157 first_cut = upper(lo, pivot, second_cut);
158 len11 = first_cut - lo;
159 }
160 rotate(first_cut, pivot, second_cut);
161 int new_mid = first_cut + len22;
162 merge(lo, first_cut, new_mid, len11, len22);
163 merge(new_mid, second_cut, hi, len1 - len11, len2 - len22);
164 }
165
166 private void rotate(int lo, int mid, int hi) {
167 int lot = lo;
168 int hit = mid - 1;
169 while (lot < hit) {
170 swap(lot++, hit--);
171 }
172 lot = mid; hit = hi - 1;
173 while (lot < hit) {
174 swap(lot++, hit--);
175 }
176 lot = lo; hit = hi - 1;
177 while (lot < hit) {
178 swap(lot++, hit--);
179 }
180 }
181
182 private int lower(int lo, int hi, int val) {
183 int len = hi - lo;
184 while (len > 0) {
185 int half = len / 2;
186 int mid= lo + half;
187 if (compare(mid, val) < 0) {
188 lo = mid + 1;
189 len = len - half -1;
190 } else {
191 len = half;
192 }
193 }
194 return lo;
195 }
196
197 private int upper(int lo, int hi, int val) {
198 int len = hi - lo;
199 while (len > 0) {
200 int half = len / 2;
201 int mid = lo + half;
202 if (compare(val, mid) < 0) {
203 len = half;
204 } else {
205 lo = mid + 1;
206 len = len - half -1;
207 }
208 }
209 return lo;
210 }
211 }
This page was automatically generated by Maven