mev-4.0.01/source/org/tigr/util/QSort.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: QSort.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.5 $
2 26 Feb 07 jari 8  * $Date: 2004/01/21 20:10:08 $
2 26 Feb 07 jari 9  * $Author: nbhagaba $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.util;
2 26 Feb 07 jari 13 import java.util.Vector;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 //import java.io.*;
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17 //SORTS IN ASCENDING ORDER
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19 public class QSort {
2 26 Feb 07 jari 20     
2 26 Feb 07 jari 21     private int[] origIndx;
2 26 Feb 07 jari 22     private float[] sorted;
2 26 Feb 07 jari 23     private double[] sortedDouble;
2 26 Feb 07 jari 24     private int[] NaNIndices;
2 26 Feb 07 jari 25     private int[] negInfinityIndices;
2 26 Feb 07 jari 26     public static final int ASCENDING = 1;
2 26 Feb 07 jari 27     public static final int DESCENDING = 2;
2 26 Feb 07 jari 28     private boolean ascending;    
2 26 Feb 07 jari 29     
2 26 Feb 07 jari 30     public QSort(float[] origA){
2 26 Feb 07 jari 31         float[] copyA = new float[origA.length];
2 26 Feb 07 jari 32         this.ascending = true;
2 26 Feb 07 jari 33         Vector NaNIndicesVector = new Vector();
2 26 Feb 07 jari 34         Vector negInfinityIndicesVector = new Vector();
2 26 Feb 07 jari 35         
2 26 Feb 07 jari 36         for (int i = 0; i < copyA.length; i++) {
2 26 Feb 07 jari 37             copyA[i] = origA[i];
2 26 Feb 07 jari 38             if (Float.isNaN(origA[i])) {
2 26 Feb 07 jari 39                 NaNIndicesVector.add(new Integer(i));
2 26 Feb 07 jari 40                 copyA[i] = Float.NEGATIVE_INFINITY; // so that NaN's are always first when the array is sorted in ascending order
2 26 Feb 07 jari 41             }
2 26 Feb 07 jari 42             if (Float.isInfinite(origA[i]) && (origA[i] < 0)) { // in case there are actual negative infinity values in origA
2 26 Feb 07 jari 43                 negInfinityIndicesVector.add(new Integer(i));
2 26 Feb 07 jari 44             }
2 26 Feb 07 jari 45         }
2 26 Feb 07 jari 46          
2 26 Feb 07 jari 47         
2 26 Feb 07 jari 48         NaNIndices = new int[NaNIndicesVector.size()];
2 26 Feb 07 jari 49         
2 26 Feb 07 jari 50         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 51             NaNIndices[i] = ((Integer)(NaNIndicesVector.get(i))).intValue();
2 26 Feb 07 jari 52         }
2 26 Feb 07 jari 53         
2 26 Feb 07 jari 54         negInfinityIndices = new int[negInfinityIndicesVector.size()];
2 26 Feb 07 jari 55         
2 26 Feb 07 jari 56         for (int i = 0; i < negInfinityIndices.length; i++) {
2 26 Feb 07 jari 57             negInfinityIndices[i] = ((Integer)(negInfinityIndicesVector.get(i))).intValue();
2 26 Feb 07 jari 58         }
2 26 Feb 07 jari 59         
2 26 Feb 07 jari 60   sort(copyA);
2 26 Feb 07 jari 61     }
2 26 Feb 07 jari 62     
2 26 Feb 07 jari 63     public QSort(double[] origA){
2 26 Feb 07 jari 64         double[] copyA = new double[origA.length];
2 26 Feb 07 jari 65         this.ascending = true;
2 26 Feb 07 jari 66         Vector NaNIndicesVector = new Vector(); 
2 26 Feb 07 jari 67         Vector negInfinityIndicesVector = new Vector();        
2 26 Feb 07 jari 68         
2 26 Feb 07 jari 69         for (int i = 0; i < copyA.length; i++) {
2 26 Feb 07 jari 70             copyA[i] = origA[i];
2 26 Feb 07 jari 71             if (Double.isNaN(origA[i])) {
2 26 Feb 07 jari 72                 NaNIndicesVector.add(new Integer(i));
2 26 Feb 07 jari 73                 copyA[i] = Double.NEGATIVE_INFINITY; // so that NaN's are always first when the array is sorted in ascending order
2 26 Feb 07 jari 74             }  
2 26 Feb 07 jari 75             if (Double.isInfinite(origA[i]) && (origA[i] < 0)) { // in case there are actual negative infinity values in origA
2 26 Feb 07 jari 76                 negInfinityIndicesVector.add(new Integer(i));
2 26 Feb 07 jari 77             }            
2 26 Feb 07 jari 78         }  
2 26 Feb 07 jari 79         
2 26 Feb 07 jari 80         NaNIndices = new int[NaNIndicesVector.size()];
2 26 Feb 07 jari 81         
2 26 Feb 07 jari 82         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 83             NaNIndices[i] = ((Integer)(NaNIndicesVector.get(i))).intValue();
2 26 Feb 07 jari 84         }   
2 26 Feb 07 jari 85         
2 26 Feb 07 jari 86         negInfinityIndices = new int[negInfinityIndicesVector.size()];
2 26 Feb 07 jari 87         
2 26 Feb 07 jari 88         for (int i = 0; i < negInfinityIndices.length; i++) {
2 26 Feb 07 jari 89             negInfinityIndices[i] = ((Integer)(negInfinityIndicesVector.get(i))).intValue();
2 26 Feb 07 jari 90         }        
2 26 Feb 07 jari 91         
2 26 Feb 07 jari 92   sort(copyA);
2 26 Feb 07 jari 93     }   
2 26 Feb 07 jari 94     
2 26 Feb 07 jari 95     public QSort(float[] origA, int ascOrDesc) {
2 26 Feb 07 jari 96         this(origA);
2 26 Feb 07 jari 97         if (ascOrDesc == QSort.ASCENDING) {
2 26 Feb 07 jari 98             this.ascending = true;
2 26 Feb 07 jari 99         } else if (ascOrDesc == QSort.DESCENDING) {
2 26 Feb 07 jari 100             this.ascending = false;
2 26 Feb 07 jari 101         }
2 26 Feb 07 jari 102     }
2 26 Feb 07 jari 103     
2 26 Feb 07 jari 104     public QSort(double[] origA, int ascOrDesc) {
2 26 Feb 07 jari 105        this(origA);
2 26 Feb 07 jari 106         if (ascOrDesc == QSort.ASCENDING) {
2 26 Feb 07 jari 107             this.ascending = true;
2 26 Feb 07 jari 108         } else if (ascOrDesc == QSort.DESCENDING) {
2 26 Feb 07 jari 109             this.ascending = false;
2 26 Feb 07 jari 110         }
2 26 Feb 07 jari 111     }    
2 26 Feb 07 jari 112     
2 26 Feb 07 jari 113     public void sort(float a[]) {
2 26 Feb 07 jari 114   
2 26 Feb 07 jari 115   origIndx = new int[a.length];
2 26 Feb 07 jari 116   for (int i = 0; i <= origIndx.length - 1; i++){
2 26 Feb 07 jari 117       origIndx[i] = i;
2 26 Feb 07 jari 118   }
2 26 Feb 07 jari 119   quickSort(a, 0, a.length - 1);
2 26 Feb 07 jari 120     }
2 26 Feb 07 jari 121     
2 26 Feb 07 jari 122     public void sort(double a[]) {
2 26 Feb 07 jari 123   
2 26 Feb 07 jari 124   origIndx = new int[a.length];
2 26 Feb 07 jari 125   for (int i = 0; i <= origIndx.length - 1; i++){
2 26 Feb 07 jari 126       origIndx[i] = i;
2 26 Feb 07 jari 127   }
2 26 Feb 07 jari 128   quickSort(a, 0, a.length - 1);
2 26 Feb 07 jari 129     }    
2 26 Feb 07 jari 130     
2 26 Feb 07 jari 131     void quickSort(float a[], int lo0, int hi0) {
2 26 Feb 07 jari 132   int lo = lo0;
2 26 Feb 07 jari 133   int hi = hi0;
2 26 Feb 07 jari 134   float mid;
2 26 Feb 07 jari 135   
2 26 Feb 07 jari 136   if ( hi0 > lo0) {
2 26 Feb 07 jari 137       
2 26 Feb 07 jari 138    /* Arbitrarily establishing partition element as the midpoint of
2 26 Feb 07 jari 139     * the array.
2 26 Feb 07 jari 140     */
2 26 Feb 07 jari 141       mid = a[ ( lo0 + hi0 ) / 2 ];
2 26 Feb 07 jari 142       
2 26 Feb 07 jari 143       // loop through the array until indices cross
2 26 Feb 07 jari 144       while( lo <= hi ) {
2 26 Feb 07 jari 145       /* find the first element that is greater than or equal to
2 26 Feb 07 jari 146        * the partition element starting from the left Index.
2 26 Feb 07 jari 147        */
2 26 Feb 07 jari 148     while( ( lo < hi0 ) && ( a[lo] < mid ))
2 26 Feb 07 jari 149         ++lo;
2 26 Feb 07 jari 150     
2 26 Feb 07 jari 151       /* find an element that is smaller than or equal to
2 26 Feb 07 jari 152        * the partition element starting from the right Index.
2 26 Feb 07 jari 153        */
2 26 Feb 07 jari 154     while( ( hi > lo0 ) && ( a[hi] > mid ))
2 26 Feb 07 jari 155         --hi;
2 26 Feb 07 jari 156     
2 26 Feb 07 jari 157     // if the indexes have not crossed, swap
2 26 Feb 07 jari 158     if( lo <= hi ) {
2 26 Feb 07 jari 159         swap(a, lo, hi);
2 26 Feb 07 jari 160         ++lo;
2 26 Feb 07 jari 161         --hi;
2 26 Feb 07 jari 162     }
2 26 Feb 07 jari 163       }
2 26 Feb 07 jari 164       
2 26 Feb 07 jari 165    /* If the right index has not reached the left side of array
2 26 Feb 07 jari 166     * must now sort the left partition.
2 26 Feb 07 jari 167     */
2 26 Feb 07 jari 168       if( lo0 < hi )
2 26 Feb 07 jari 169     quickSort( a, lo0, hi );
2 26 Feb 07 jari 170       
2 26 Feb 07 jari 171    /* If the left index has not reached the right side of array
2 26 Feb 07 jari 172     * must now sort the right partition.
2 26 Feb 07 jari 173     */
2 26 Feb 07 jari 174       if( lo < hi0 )
2 26 Feb 07 jari 175     quickSort( a, lo, hi0 );
2 26 Feb 07 jari 176       
2 26 Feb 07 jari 177   }
2 26 Feb 07 jari 178   sorted = a;
2 26 Feb 07 jari 179     }
2 26 Feb 07 jari 180     
2 26 Feb 07 jari 181     void quickSort(double a[], int lo0, int hi0) {
2 26 Feb 07 jari 182   int lo = lo0;
2 26 Feb 07 jari 183   int hi = hi0;
2 26 Feb 07 jari 184   double mid;
2 26 Feb 07 jari 185   
2 26 Feb 07 jari 186   if ( hi0 > lo0) {
2 26 Feb 07 jari 187       
2 26 Feb 07 jari 188    /* Arbitrarily establishing partition element as the midpoint of
2 26 Feb 07 jari 189     * the array.
2 26 Feb 07 jari 190     */
2 26 Feb 07 jari 191       mid = a[ ( lo0 + hi0 ) / 2 ];
2 26 Feb 07 jari 192       
2 26 Feb 07 jari 193       // loop through the array until indices cross
2 26 Feb 07 jari 194       while( lo <= hi ) {
2 26 Feb 07 jari 195       /* find the first element that is greater than or equal to
2 26 Feb 07 jari 196        * the partition element starting from the left Index.
2 26 Feb 07 jari 197        */
2 26 Feb 07 jari 198     while( ( lo < hi0 ) && ( a[lo] < mid ))
2 26 Feb 07 jari 199         ++lo;
2 26 Feb 07 jari 200     
2 26 Feb 07 jari 201       /* find an element that is smaller than or equal to
2 26 Feb 07 jari 202        * the partition element starting from the right Index.
2 26 Feb 07 jari 203        */
2 26 Feb 07 jari 204     while( ( hi > lo0 ) && ( a[hi] > mid ))
2 26 Feb 07 jari 205         --hi;
2 26 Feb 07 jari 206     
2 26 Feb 07 jari 207     // if the indexes have not crossed, swap
2 26 Feb 07 jari 208     if( lo <= hi ) {
2 26 Feb 07 jari 209         swap(a, lo, hi);
2 26 Feb 07 jari 210         ++lo;
2 26 Feb 07 jari 211         --hi;
2 26 Feb 07 jari 212     }
2 26 Feb 07 jari 213       }
2 26 Feb 07 jari 214       
2 26 Feb 07 jari 215    /* If the right index has not reached the left side of array
2 26 Feb 07 jari 216     * must now sort the left partition.
2 26 Feb 07 jari 217     */
2 26 Feb 07 jari 218       if( lo0 < hi )
2 26 Feb 07 jari 219     quickSort( a, lo0, hi );
2 26 Feb 07 jari 220       
2 26 Feb 07 jari 221    /* If the left index has not reached the right side of array
2 26 Feb 07 jari 222     * must now sort the right partition.
2 26 Feb 07 jari 223     */
2 26 Feb 07 jari 224       if( lo < hi0 )
2 26 Feb 07 jari 225     quickSort( a, lo, hi0 );
2 26 Feb 07 jari 226       
2 26 Feb 07 jari 227   }
2 26 Feb 07 jari 228   sortedDouble = a;
2 26 Feb 07 jari 229     }    
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     private void swap(float a[], int i, int j) {
2 26 Feb 07 jari 232   
2 26 Feb 07 jari 233   float T;
2 26 Feb 07 jari 234   T = a[i];
2 26 Feb 07 jari 235   a[i] = a[j];
2 26 Feb 07 jari 236   a[j] = T;
2 26 Feb 07 jari 237   
2 26 Feb 07 jari 238   int TT = origIndx[i];
2 26 Feb 07 jari 239   origIndx[i] = origIndx[j];
2 26 Feb 07 jari 240   origIndx[j] = TT;
2 26 Feb 07 jari 241     }
2 26 Feb 07 jari 242     
2 26 Feb 07 jari 243     private void swap(double a[], int i, int j) {
2 26 Feb 07 jari 244   
2 26 Feb 07 jari 245   double T;
2 26 Feb 07 jari 246   T = a[i];
2 26 Feb 07 jari 247   a[i] = a[j];
2 26 Feb 07 jari 248   a[j] = T;
2 26 Feb 07 jari 249   
2 26 Feb 07 jari 250   int TT = origIndx[i];
2 26 Feb 07 jari 251   origIndx[i] = origIndx[j];
2 26 Feb 07 jari 252   origIndx[j] = TT;
2 26 Feb 07 jari 253     }    
2 26 Feb 07 jari 254     
2 26 Feb 07 jari 255     public float[] getSorted(){
2 26 Feb 07 jari 256         /*
2 26 Feb 07 jari 257         Vector sortedVector = new Vector();
2 26 Feb 07 jari 258         Vector NaNSortedIndices = new Vector();
2 26 Feb 07 jari 259         
2 26 Feb 07 jari 260         for (int i = 0; i < sorted.length; i++) {
2 26 Feb 07 jari 261             if (Float.isNaN(sorted[i])) {
2 26 Feb 07 jari 262                 NaNSortedIndices.add(new Integer(i));
2 26 Feb 07 jari 263             } else {
2 26 Feb 07 jari 264                 sortedVector.add(new Float(sorted[i]));
2 26 Feb 07 jari 265             }
2 26 Feb 07 jari 266         }
2 26 Feb 07 jari 267         
2 26 Feb 07 jari 268         for (int i = 0; i < NaNSortedIndices.size(); i++) {
2 26 Feb 07 jari 269             sortedVector.add(0, new Float(Float.NaN));
2 26 Feb 07 jari 270         }
2 26 Feb 07 jari 271         for (int i = 0; i < sortedVector.size(); i++) {
2 26 Feb 07 jari 272             sorted[i] = ((Float)(sortedVector.get(i))).floatValue();
2 26 Feb 07 jari 273         }
2 26 Feb 07 jari 274          */
2 26 Feb 07 jari 275         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 276             sorted[i] = Float.NaN;
2 26 Feb 07 jari 277         }
2 26 Feb 07 jari 278         if (!ascending) {
2 26 Feb 07 jari 279             float[] revSorted = reverse(sorted);
2 26 Feb 07 jari 280             return revSorted;
2 26 Feb 07 jari 281         } else {        
2 26 Feb 07 jari 282             return sorted;
2 26 Feb 07 jari 283         }        
2 26 Feb 07 jari 284   //return sorted;
2 26 Feb 07 jari 285     }
2 26 Feb 07 jari 286     
2 26 Feb 07 jari 287     public double[] getSortedDouble(){
2 26 Feb 07 jari 288         /*
2 26 Feb 07 jari 289         Vector sortedVector = new Vector();
2 26 Feb 07 jari 290         Vector NaNSortedIndices = new Vector();
2 26 Feb 07 jari 291         
2 26 Feb 07 jari 292         for (int i = 0; i < sortedDouble.length; i++) {
2 26 Feb 07 jari 293             if (Double.isNaN(sortedDouble[i])) {
2 26 Feb 07 jari 294                 NaNSortedIndices.add(new Integer(i));
2 26 Feb 07 jari 295             } else {
2 26 Feb 07 jari 296                 sortedVector.add(new Double(sortedDouble[i]));
2 26 Feb 07 jari 297             }
2 26 Feb 07 jari 298         }
2 26 Feb 07 jari 299         
2 26 Feb 07 jari 300         for (int i = 0; i < NaNSortedIndices.size(); i++) {
2 26 Feb 07 jari 301             sortedVector.add(0, new Double(Double.NaN));
2 26 Feb 07 jari 302         }
2 26 Feb 07 jari 303         for (int i = 0; i < sortedVector.size(); i++) {
2 26 Feb 07 jari 304             sortedDouble[i] = ((Double)(sortedVector.get(i))).doubleValue();
2 26 Feb 07 jari 305         } 
2 26 Feb 07 jari 306          */
2 26 Feb 07 jari 307         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 308             sortedDouble[i] = Double.NaN;
2 26 Feb 07 jari 309         }        
2 26 Feb 07 jari 310         
2 26 Feb 07 jari 311         if (!ascending) {
2 26 Feb 07 jari 312             double[] revSortedDouble = reverse(sortedDouble);
2 26 Feb 07 jari 313             return revSortedDouble;
2 26 Feb 07 jari 314         } else {        
2 26 Feb 07 jari 315             return sortedDouble;
2 26 Feb 07 jari 316         }
2 26 Feb 07 jari 317     }    
2 26 Feb 07 jari 318     
2 26 Feb 07 jari 319     public int[] getOrigIndx(){
2 26 Feb 07 jari 320         /*
2 26 Feb 07 jari 321         Vector origIndxVector = new Vector();
2 26 Feb 07 jari 322         for (int i = 0; i < origIndx.length; i++) {
2 26 Feb 07 jari 323             if (!isNaNIndex(origIndx[i])) {
2 26 Feb 07 jari 324                 origIndxVector.add(new Integer(origIndx[i]));
2 26 Feb 07 jari 325             }
2 26 Feb 07 jari 326         }
2 26 Feb 07 jari 327         
2 26 Feb 07 jari 328         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 329             origIndxVector.add(0, new Integer(NaNIndices[i]));
2 26 Feb 07 jari 330         }
2 26 Feb 07 jari 331         
2 26 Feb 07 jari 332         for (int i = 0; i < origIndxVector.size(); i++) {
2 26 Feb 07 jari 333             origIndx[i] = ((Integer)(origIndxVector.get(i))).intValue();
2 26 Feb 07 jari 334         }
2 26 Feb 07 jari 335          */
2 26 Feb 07 jari 336         
2 26 Feb 07 jari 337         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 338             origIndx[i] = NaNIndices[i];
2 26 Feb 07 jari 339         }
2 26 Feb 07 jari 340         
2 26 Feb 07 jari 341         for (int i = NaNIndices.length; i < NaNIndices.length + negInfinityIndices.length; i++) {
2 26 Feb 07 jari 342             origIndx[i] = negInfinityIndices[i - NaNIndices.length];
2 26 Feb 07 jari 343         }
2 26 Feb 07 jari 344         
2 26 Feb 07 jari 345         if (!ascending) {
2 26 Feb 07 jari 346             return reverse(origIndx);
2 26 Feb 07 jari 347         } else {        
2 26 Feb 07 jari 348             return origIndx;
2 26 Feb 07 jari 349         }
2 26 Feb 07 jari 350     }
2 26 Feb 07 jari 351
2 26 Feb 07 jari 352     private boolean isNaNIndex(int index) {
2 26 Feb 07 jari 353         for (int i = 0; i < NaNIndices.length; i++) {
2 26 Feb 07 jari 354             if (index == NaNIndices[i]) {
2 26 Feb 07 jari 355                 return true;
2 26 Feb 07 jari 356             }
2 26 Feb 07 jari 357         }
2 26 Feb 07 jari 358         
2 26 Feb 07 jari 359         return false;
2 26 Feb 07 jari 360     }
2 26 Feb 07 jari 361     
2 26 Feb 07 jari 362     private int[] reverse(int[] arr) {
2 26 Feb 07 jari 363         int[] revArr = new int[arr.length];
2 26 Feb 07 jari 364         int  revCount = 0;
2 26 Feb 07 jari 365         int count = arr.length - 1;
2 26 Feb 07 jari 366         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 367             revArr[revCount] = arr[count];
2 26 Feb 07 jari 368             revCount++;
2 26 Feb 07 jari 369             count--;
2 26 Feb 07 jari 370         }
2 26 Feb 07 jari 371         return revArr;
2 26 Feb 07 jari 372     }
2 26 Feb 07 jari 373     
2 26 Feb 07 jari 374     private float[] reverse(float[] arr) {
2 26 Feb 07 jari 375         float[] revArr = new float[arr.length];
2 26 Feb 07 jari 376         int  revCount = 0;
2 26 Feb 07 jari 377         int count = arr.length - 1;
2 26 Feb 07 jari 378         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 379             revArr[revCount] = arr[count];
2 26 Feb 07 jari 380             revCount++;
2 26 Feb 07 jari 381             count--;
2 26 Feb 07 jari 382         }
2 26 Feb 07 jari 383         return revArr;
2 26 Feb 07 jari 384     }    
2 26 Feb 07 jari 385     
2 26 Feb 07 jari 386     private double[] reverse(double[] arr) {
2 26 Feb 07 jari 387         double[] revArr = new double[arr.length];
2 26 Feb 07 jari 388         int  revCount = 0;
2 26 Feb 07 jari 389         int count = arr.length - 1;
2 26 Feb 07 jari 390         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 391             revArr[revCount] = arr[count];
2 26 Feb 07 jari 392             revCount++;
2 26 Feb 07 jari 393             count--;
2 26 Feb 07 jari 394         }
2 26 Feb 07 jari 395         return revArr;
2 26 Feb 07 jari 396     }   
2 26 Feb 07 jari 397     
2 26 Feb 07 jari 398     public static void main(String[] args) {
2 26 Feb 07 jari 399         
2 26 Feb 07 jari 400         double[] arr = {120d, 0.01d, -4.5d, Double.NaN, 7.6d, -65d, Double.NEGATIVE_INFINITY, 3.5d, -0.95d, Double.POSITIVE_INFINITY, 600d, Double.NaN, 65d, Double.NEGATIVE_INFINITY, Double.MAX_VALUE};
2 26 Feb 07 jari 401         
2 26 Feb 07 jari 402         QSort sortArr = new QSort(arr, QSort.ASCENDING);
2 26 Feb 07 jari 403         double[] sortedArr = sortArr.getSortedDouble();
2 26 Feb 07 jari 404         int[] sortedArrIndices = sortArr.getOrigIndx();
2 26 Feb 07 jari 405         for (int i = 0; i < sortedArr.length; i++) {
2 26 Feb 07 jari 406             System.out.println("arr[" + i + "] = " + arr[i] + ", sortedArr[" + i + "] = " + sortedArr[i] + ",  sortedArrIndices[" + i + "] = " + sortedArrIndices[i]);
2 26 Feb 07 jari 407         }
2 26 Feb 07 jari 408                 
2 26 Feb 07 jari 409     }
2 26 Feb 07 jari 410     
2 26 Feb 07 jari 411 }
2 26 Feb 07 jari 412