package com.geothethird.utils { import flash.utils.ByteArray; /** * * @author Third * * Copyright (c) 2009, The Third * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the Coder Shack nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ public final class BubbleSort { /** * Performs BubbleSort on array contents. * *
An attribute parrameter may be passed in to change * sort to compare the object attribute rather * than the data itself.
* *The final parameter reverse reverses the sort, * the default is bubble sort smallest to largest.
* * @param ar * @param attr * @param reverse * @return * */ public static function sortArray(ar:Array, attr:String=null, reverse:Boolean=false):Array { for (var o:int = ar.length - 1; o > 0;o--) { for (var i:int = 0; i < o;i++) { if(!reverse) { if(attr!=null) { if(ar[i][attr] < ar[i + 1][attr]) swap(ar[i], ar[i + 1], ar); } else { if(ar[i] < ar[i + 1]) swap(ar[i], ar[i + 1], ar); } } else { if(attr != null) { if(ar[i][attr] > ar[i + 1][attr]) swap(ar[i], ar[i + 1], ar); } else { if(ar[i] > ar[i + 1]) swap(ar[i], ar[i + 1], ar); } } } } return ar; } /** * @private Swap items within array. * @param item1 * @param item2 * @param ar * */ private static function swap(item1:Object, item2:Object, ar:Array):void { for (var i:int = 0; i < ar.length; i++) if(ar[i] == item1) ar[i] = copyObj(item2); else if (ar[i] == item2) ar[i] = copyObj(item1); } /** * @private creates a copy of an object * @param obj * @return * */ private static function copyObj(obj:Object):* { var copy:ByteArray = new ByteArray(); copy.writeObject(obj); copy.position = 0; return(copy.readObject()); } } }