KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > util > Sort


1 /*
2  * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
3  *
4  * This file is part of Resin(R) Open Source
5  *
6  * Each copy or derived work must preserve the copyright notice and this
7  * notice unmodified.
8  *
9  * Resin Open Source is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Resin Open Source is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17  * of NON-INFRINGEMENT. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Resin Open Source; if not, write to the
22  * Free SoftwareFoundation, Inc.
23  * 59 Temple Place, Suite 330
24  * Boston, MA 02111-1307 USA
25  *
26  * @author Scott Ferguson
27  */

28
29 package com.caucho.util;
30
31 import java.util.ArrayList JavaDoc;
32
33 abstract public class Sort {
34   abstract public boolean lessThan(Object JavaDoc a, Object JavaDoc b);
35
36   private void quicksort(ArrayList JavaDoc list, int head, int tail)
37   {
38     if (tail - head < 2)
39       return;
40     else if (tail - head == 2) {
41       Object JavaDoc va = list.get(head);
42       Object JavaDoc vb = list.get(head + 1);
43
44       if (lessThan(vb, va)) {
45     list.set(head, vb);
46     list.set(head + 1, va);
47       }
48
49       return;
50     }
51
52     int center = head + 1;
53     Object JavaDoc pivot = list.get(head);
54     for (int i = head + 1; i < tail; i++) {
55       Object JavaDoc value = list.get(i);
56       
57       if (lessThan(value, pivot)) {
58     Object JavaDoc centerValue = list.get(center);
59     list.set(center, value);
60     list.set(i, centerValue);
61     center++;
62       }
63     }
64
65     if (center == tail) {
66       Object JavaDoc tailValue = list.get(tail - 1);
67       list.set(head, tailValue);
68       list.set(tail - 1, pivot);
69
70       quicksort(list, head, tail - 1);
71     } else {
72       quicksort(list, head, center);
73       quicksort(list, center, tail);
74     }
75   }
76
77   public void sort(ArrayList JavaDoc list)
78   {
79     quicksort(list, 0, list.size());
80   }
81 }
82
83
84
Popular Tags