/*
* 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.
*/

/**
 * Quick select n-th element in an array.
 *
 * Note: it will change the elements placement in array.
 *
 * @module echarts/core/quickSelect
 * @author Yi Shen(https://github.com/pissang)
 */
function defaultCompareFunc(a, b) {
  return a - b;
}

function swapElement(arr, idx0, idx1) {
  var tmp = arr[idx0];
  arr[idx0] = arr[idx1];
  arr[idx1] = tmp;
}

function select(arr, left, right, nth, compareFunc) {
  var pivotIdx = left;
  var pivotValue;

  while (right > left) {
    pivotIdx = Math.round((right + left) / 2);
    pivotValue = arr[pivotIdx]; // Swap pivot to the end

    swapElement(arr, pivotIdx, right);
    pivotIdx = left;

    for (var i = left; i <= right - 1; i++) {
      if (compareFunc(pivotValue, arr[i]) >= 0) {
        swapElement(arr, i, pivotIdx);
        pivotIdx++;
      }
    }

    swapElement(arr, right, pivotIdx);

    if (pivotIdx === nth) {
      return pivotIdx;
    } else if (pivotIdx < nth) {
      left = pivotIdx + 1;
    } else {
      right = pivotIdx - 1;
    }
  } // Left == right


  return left;
}
/**
 * @alias module:echarts/core/quickSelect
 * @param {Array} arr
 * @param {number} [left]
 * @param {number} [right]
 * @param {number} nth
 * @param {Function} [compareFunc]
 * @example
 *     var quickSelect = require('echarts/core/quickSelect');
 *     var arr = [5, 2, 1, 4, 3]
 *     quickSelect(arr, 3);
 *     quickSelect(arr, 0, 3, 1, function (a, b) {return a - b});
 *
 * @return {number}
 */


export default function (arr, left, right, nth, compareFunc) {
  if (arguments.length <= 3) {
    nth = left;

    if (arguments.length === 2) {
      compareFunc = defaultCompareFunc;
    } else {
      compareFunc = right;
    }

    left = 0;
    right = arr.length - 1;
  }

  return select(arr, left, right, nth, compareFunc);
}