Here you can find the source of sortByIndex(int start, int end, int[] indexes, double[] values)
Parameter | Description |
---|---|
start | starting index |
end | ending index |
indexes | array of indexes to sort by |
values | double array of values to sort |
public static void sortByIndex(int start, int end, int[] indexes, double[] values)
//package com.java2s; /*//from w w w . j a v a 2 s. co m * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ public class Main { /** * In-place sort of two arrays, only indexes is used for comparison and values * of same position are sorted accordingly. * * @param start starting index * @param end ending index * @param indexes array of indexes to sort by * @param values double array of values to sort */ public static void sortByIndex(int start, int end, int[] indexes, double[] values) { int tempIx; double tempVal; int length = end - start; if (length < 7) { for (int i = start + 1; i < end; i++) { for (int j = i; j > start && indexes[j - 1] > indexes[j]; j--) { tempIx = indexes[j]; indexes[j] = indexes[j - 1]; indexes[j - 1] = tempIx; tempVal = values[j]; values[j] = values[j - 1]; values[j - 1] = tempVal; } } return; } int middle = (start + end) / 2; if (length > 7) { int bottom = start; int top = end - 1; if (length > 40) { length /= 8; bottom = med3(indexes, bottom, bottom + length, bottom + (2 * length)); middle = med3(indexes, middle - length, middle, middle + length); top = med3(indexes, top - (2 * length), top - length, top); } middle = med3(indexes, bottom, middle, top); } int partionValue = indexes[middle]; int a, b, c, d; a = b = start; c = d = end - 1; while (true) { while (b <= c && indexes[b] <= partionValue) { if (indexes[b] == partionValue) { tempIx = indexes[a]; indexes[a] = indexes[b]; indexes[b] = tempIx; tempVal = values[a]; values[a++] = values[b]; values[b] = tempVal; } b++; } while (c >= b && indexes[c] >= partionValue) { if (indexes[c] == partionValue) { tempIx = indexes[c]; indexes[c] = indexes[d]; indexes[d] = tempIx; tempVal = values[c]; values[c] = values[d]; values[d--] = tempVal; } c--; } if (b > c) { break; } tempIx = indexes[b]; indexes[b] = indexes[c]; indexes[c] = tempIx; tempVal = values[b]; values[b++] = values[c]; values[c--] = tempVal; } length = a - start < b - a ? a - start : b - a; int l = start; int h = b - length; while (length-- > 0) { tempIx = indexes[l]; indexes[l] = indexes[h]; indexes[h] = tempIx; tempVal = values[l]; values[l++] = values[h]; values[h++] = tempVal; } length = d - c < end - 1 - d ? d - c : end - 1 - d; l = b; h = end - length; while (length-- > 0) { tempIx = indexes[l]; indexes[l] = indexes[h]; indexes[h] = tempIx; tempVal = values[l]; values[l++] = values[h]; values[h++] = tempVal; } if ((length = b - a) > 0) { sortByIndex(start, start + length, indexes, values); } if ((length = d - c) > 0) { sortByIndex(end - length, end, indexes, values); } } /** * In-place sort of three arrays, only first indexes is used for comparison and second * indexes as well as values of same position are sorted accordingly. * * @param start starting index * @param end ending index * @param indexes ? * @param indexes2 ? * @param values ? */ public static void sortByIndex(int start, int end, int[] indexes, int[] indexes2, double[] values) { int tempIx; int tempIx2; double tempVal; int length = end - start; if (length < 7) { for (int i = start + 1; i < end; i++) { for (int j = i; j > start && indexes[j - 1] > indexes[j]; j--) { tempIx = indexes[j]; indexes[j] = indexes[j - 1]; indexes[j - 1] = tempIx; tempIx2 = indexes2[j]; indexes2[j] = indexes2[j - 1]; indexes2[j - 1] = tempIx2; tempVal = values[j]; values[j] = values[j - 1]; values[j - 1] = tempVal; } } return; } int middle = (start + end) / 2; if (length > 7) { int bottom = start; int top = end - 1; if (length > 40) { length /= 8; bottom = med3(indexes, bottom, bottom + length, bottom + (2 * length)); middle = med3(indexes, middle - length, middle, middle + length); top = med3(indexes, top - (2 * length), top - length, top); } middle = med3(indexes, bottom, middle, top); } int partionValue = indexes[middle]; int a, b, c, d; a = b = start; c = d = end - 1; while (true) { while (b <= c && indexes[b] <= partionValue) { if (indexes[b] == partionValue) { tempIx = indexes[a]; indexes[a] = indexes[b]; indexes[b] = tempIx; tempIx2 = indexes2[a]; indexes2[a] = indexes2[b]; indexes2[b] = tempIx2; tempVal = values[a]; values[a++] = values[b]; values[b] = tempVal; } b++; } while (c >= b && indexes[c] >= partionValue) { if (indexes[c] == partionValue) { tempIx = indexes[c]; indexes[c] = indexes[d]; indexes[d] = tempIx; tempIx2 = indexes2[c]; indexes2[c] = indexes2[d]; indexes2[d] = tempIx2; tempVal = values[c]; values[c] = values[d]; values[d--] = tempVal; } c--; } if (b > c) { break; } tempIx = indexes[b]; indexes[b] = indexes[c]; indexes[c] = tempIx; tempIx2 = indexes2[b]; indexes2[b] = indexes2[c]; indexes2[c] = tempIx2; tempVal = values[b]; values[b++] = values[c]; values[c--] = tempVal; } length = a - start < b - a ? a - start : b - a; int l = start; int h = b - length; while (length-- > 0) { tempIx = indexes[l]; indexes[l] = indexes[h]; indexes[h] = tempIx; tempIx2 = indexes2[l]; indexes2[l] = indexes2[h]; indexes2[h] = tempIx2; tempVal = values[l]; values[l++] = values[h]; values[h++] = tempVal; } length = d - c < end - 1 - d ? d - c : end - 1 - d; l = b; h = end - length; while (length-- > 0) { tempIx = indexes[l]; indexes[l] = indexes[h]; indexes[h] = tempIx; tempIx2 = indexes2[l]; indexes2[l] = indexes2[h]; indexes2[h] = tempIx2; tempVal = values[l]; values[l++] = values[h]; values[h++] = tempVal; } if ((length = b - a) > 0) { sortByIndex(start, start + length, indexes, indexes2, values); } if ((length = d - c) > 0) { sortByIndex(end - length, end, indexes, indexes2, values); } } private static int med3(int[] array, int a, int b, int c) { int x = array[a], y = array[b], z = array[c]; return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c : a)); } private static int med3(double[] array, int a, int b, int c) { double x = array[a], y = array[b], z = array[c]; return x < y ? (y < z ? b : (x < z ? c : a)) : (y > z ? b : (x > z ? c : a)); } }