/*******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
*******************************************************************************/
package org.eclipse.linuxtools.systemtap.structures;
public final class Sort {
/**
* Performs quicksort on the supplied list.
*
* @param list The list to sort.
* @param p Recursed value, initially top value.
* @param r Recursed value, initially bottom value.
*/
public static void quicksort(Object[] list, int p, int r) {
if(null == list) {
return;
} else if (p < r) {
int q = partition(list,p,r);
if (q == r) {
q--;
}
quicksort(list,p,q);
quicksort(list,q+1,r);
}
}
/**
* Partitions the input list, used by Quiksort.
*
* @param list The list to partition.
* @param p Recursed value, initially top value.
* @param r Recursed value, initially bottom value.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private static int partition (Object[] list, int p, int r) {
Comparable pivot = (list[p] instanceof Comparable ? (Comparable)list[p] : list[p].toString());
int lo = p;
int hi = r;
while (true) {
while (getComparable(list[hi]).compareTo(pivot) >= 0 && lo < hi) {
hi--;
}
while (getComparable(list[lo]).compareTo(pivot) < 0 && lo < hi) {
lo++;
}
if (lo < hi) {
Object T = list[lo];
list[lo] = list[hi];
list[hi] = T;
} else {
return hi;
}
}
}
@SuppressWarnings("rawtypes")
private static Comparable getComparable(Object o) {
return (o instanceof Comparable
? (Comparable)o
: o.toString());
}
}