Java tutorial
//package com.java2s; /** * This file is part of the Java Machine Learning Library * <p/> * The Java Machine Learning Library is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * <p/> * The Java Machine Learning Library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * <p/> * You should have received a copy of the GNU General Public License * along with the Java Machine Learning Library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * <p/> * Copyright (c) 2006-2012, Thomas Abeel * <p/> * Project: http://java-ml.sourceforge.net/ */ public class Main { /** * Sorts a given array of doubles in ascending order and returns an array of * integers with the positions of the elements of the original array in the * sorted array. * * NOTE: this array is not changed by the method! * * @param array * this array is not changed by the method! * @return an array of integers with the positions in the sorted array. */ public static int[] sort(double[] array) { int[] index = new int[array.length]; array = (double[]) array.clone(); for (int i = 0; i < index.length; i++) { index[i] = i; if (Double.isNaN(array[i])) { array[i] = Double.MAX_VALUE; } } quickSort(array, index, 0, array.length - 1); return index; } /** * Implements quicksort according to Manber's "Introduction to Algorithms". * * @param array * the array of doubles to be sorted * @param index * the index into the array of doubles * @param left * the first index of the subset to be sorted * @param right * the last index of the subset to be sorted */ // @ requires 0 <= first && first <= right && right < array.length; // @ requires (\forall int i; 0 <= i && i < index.length; 0 <= index[i] && // index[i] < array.length); // @ requires array != index; // assignable index; private static void quickSort(/* @non_null@ */double[] array, /* @non_null@ */ int[] index, int left, int right) { if (left < right) { int middle = partition(array, index, left, right); quickSort(array, index, left, middle); quickSort(array, index, middle + 1, right); } } /** * Partitions the instances around a pivot. Used by quicksort and * kthSmallestValue. * * @param array * the array of doubles to be sorted * @param index * the index into the array of doubles * @param l * the first index of the subset * @param r * the last index of the subset * * @return the index of the middle element */ private static int partition(double[] array, int[] index, int l, int r) { double pivot = array[index[(l + r) / 2]]; int help; while (l < r) { while ((array[index[l]] < pivot) && (l < r)) { l++; } while ((array[index[r]] > pivot) && (l < r)) { r--; } if (l < r) { help = index[l]; index[l] = index[r]; index[r] = help; l++; r--; } } if ((l == r) && (array[index[r]] > pivot)) { r--; } return r; } }