/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.tools.gui.treetable; /* * MergeSort.java * * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. * */ /** * An implementation of MergeSort, needs to be subclassed to compare the terms. * * @author Scott Violet * @version $Revision$, $Date$ */ public abstract class MergeSort extends Object { //~ Instance fields -------------------------------------------------------- protected Object[] toSort; protected Object[] swapSpace; //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param array DOCUMENT ME! */ public void sort(final Object[] array) { if ((array != null) && (array.length > 1)) { final int maxLength; maxLength = array.length; swapSpace = new Object[maxLength]; toSort = array; this.mergeSort(0, maxLength - 1); swapSpace = null; toSort = null; } } /** * DOCUMENT ME! * * @param beginLoc DOCUMENT ME! * @param endLoc DOCUMENT ME! * * @return DOCUMENT ME! */ public abstract int compareElementsAt(int beginLoc, int endLoc); /** * DOCUMENT ME! * * @param begin DOCUMENT ME! * @param end DOCUMENT ME! */ protected void mergeSort(final int begin, final int end) { if (begin != end) { final int mid; mid = (begin + end) / 2; this.mergeSort(begin, mid); this.mergeSort(mid + 1, end); this.merge(begin, mid, end); } } /** * DOCUMENT ME! * * @param begin DOCUMENT ME! * @param middle DOCUMENT ME! * @param end DOCUMENT ME! */ protected void merge(final int begin, final int middle, final int end) { int firstHalf; int secondHalf; int count; firstHalf = count = begin; secondHalf = middle + 1; while ((firstHalf <= middle) && (secondHalf <= end)) { if (this.compareElementsAt(secondHalf, firstHalf) < 0) { swapSpace[count++] = toSort[secondHalf++]; } else { swapSpace[count++] = toSort[firstHalf++]; } } if (firstHalf <= middle) { while (firstHalf <= middle) { swapSpace[count++] = toSort[firstHalf++]; } } else { while (secondHalf <= end) { swapSpace[count++] = toSort[secondHalf++]; } } for (count = begin; count <= end; count++) { toSort[count] = swapSpace[count]; } } }