private short[] chooseSplitIndex(short axis) {

			int used = this.getUsed();
			int rstarMin = getMMin();

			short[] sort = new short[used];
			short[] bestSort = new short[used + 1];

			int k;
			int maxK = (getMMax() - 2 * rstarMin + 2); // Anzahl der Teilmengen
			// M - 2m + 2
			double value = 0.0;
			double bestValue = Double.MAX_VALUE;
			short bestSplitIndex = -1;
			double bestAreaValue = -1.0;
			double areaValue = -1.0;
			boolean newBestValue = false;

			for (short minMax = 1; minMax < 3; minMax++) {

				for (short i = 0; i < used; i++)
					// init Array
					sort[i] = i;

				quickSort(sort, (short) 0, (short) (used - 1), minMax, axis);

				// Search for best distribution
				for (k = 0; k < maxK; k++) {
					// based on the overlap value
					value = computeOverlapValue(sort, (short) 0,
							(short) (rstarMin - 1 + k), (short) (used - 1));

					if (value <= bestValue) {
						newBestValue = true;

						if (value == bestValue) { // based on area value
							bestAreaValue = computeAreaValue(bestSort,
									(short) 0, bestSplitIndex)
									+ computeAreaValue(bestSort,
											(short) (bestSplitIndex + 1),
											(short) (used - 1));
							// Here an IllegalArgumentException can be thrown.

							areaValue = computeAreaValue(sort, (short) 0,
									(short) (rstarMin - 1 + k))
									+ computeAreaValue(sort,
											(short) (rstarMin + k),
											(short) (used - 1));

							if (areaValue >= bestAreaValue)
								newBestValue = false; // doch kein neuer Bester
							// Wert
						}
					}
					if (newBestValue) {
						newBestValue = false;
						bestValue = value;
						bestSplitIndex = (short) (rstarMin - 1 + k);

						for (int i = 0; i < used; i++)
							// copy Array
							bestSort[i] = sort[i];
					}
				}
			}

			bestSort[bestSort.length - 1] = bestSplitIndex;
			return bestSort;
		}