Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript根据元素与给定目标的距离对int数组进行排序_Javascript_Arrays_Algorithm_Sorting - Fatal编程技术网

使用javascript根据元素与给定目标的距离对int数组进行排序

使用javascript根据元素与给定目标的距离对int数组进行排序,javascript,arrays,algorithm,sorting,Javascript,Arrays,Algorithm,Sorting,算法:距离排序(数组、目标) 输入:从最小值到最大值排序的整数数组,以及用于测量距离的整数 输出:按距离目标的距离排序的数组 示例 距离排序([-10,-6,3,5],1) 返回[3,5,-6,-10]这里有一种方法。使用功能 首先,执行二进制搜索(我总是复制)以查找数组中的目标(如果它存在,或者立即找到更大的目标) 然后,保持两个指针在同一方向上移动,始终添加与目标距离较小的元素 二进制搜索是O(logn),移动指针是O(n)。整体算法为O(n) 函数下限(arr,目标){ var first

算法:距离排序(数组、目标)
输入:从最小值到最大值排序的整数数组,以及用于测量距离的整数
输出:按距离目标的距离排序的数组


示例
距离排序([-10,-6,3,5],1)

返回[3,5,-6,-10]

这里有一种方法。使用功能


首先,执行二进制搜索(我总是复制)以查找数组中的目标(如果它存在,或者立即找到更大的目标)

然后,保持两个指针在同一方向上移动,始终添加与目标距离较小的元素

二进制搜索是O(logn),移动指针是O(n)。整体算法为O(n)

函数下限(arr,目标){
var first=0,
计数=arr.length;
而(计数>0){
var阶跃=计数/2;
var it=第一步+第二步;
if(arr[it]=0 | | j=arr.length | | target arr[i]
它可以很好地转换为ECMA6(如果您使用的是Babel):


你的问题是什么?你尝试过什么?你有什么代码吗?有趣的解决方案。输入数组是从最小到最大排序的。这个算法没有利用这一点。你知道你的解决方案的时间复杂度吗?我错过了从最小到最大排序的输入数组,但这不会改变输出。我不知道我会给你一条路,你可以完成剩下的;)。我不会停下来思考这个问题,因为问题不是关于性能。我喜欢你使用ECMA6,但之前发布的答案使用了几乎相同的功能。是的,我在发布后看到了这一点……但我还是离开了它,因为我包含了ECMA6部分。你知道这是否在O(n logn)中运行吗?可能,考虑到排序的比较次数。是的,它可能不是一个优化的解决方案。我只对较小的排序使用了排序函数,所以我没有遇到任何问题,但我怀疑它是否能很好地扩展。
var a = [-10, -6, 3, 5, 99, 76, -100];

function distanceSort(arr, target) {
   return arr.sort(function(a, b) {
      var distance1 = Math.abs(target - a);
      var distance2 = Math.abs(target - b);

      return distance1 == distance2 ? 0 : (distance1 > distance2 ? 1 : -1);
   });
}

console.log(distanceSort(a, 100)); //[99,76,5,3,-6, -10, -100]
console.log(distance(a, -5)); //[-6, -10, 3, 5, 76, -100, 99]
function lowerBound(arr, target) {
    var first = 0, 
        count = arr.length;

    while (count > 0) {
        var step = count / 2;
        var it = first + step;

        if (arr[it] < target) {
            first = it + 1;
            count -= step + 1;
        } else {
            count = step;
        }
    }

    return first;
}

function distanceSort(arr, target) {
    var answer = [];

    var j = lowerBound(arr, target);
    var i = j-1;

    while (i >= 0 || j<arr.length) {
        if (j >= arr.length || target-arr[i]<arr[j]-target)
            answer.push(arr[i--]);
        else
            answer.push(arr[j++]);
    }
    return answer;
}

console.log(distanceSort([-10,-6,3,5], 1));   //[3, 5, -6, -10]
console.log(distanceSort([-10,-6,3,5], -11)); //[-10, -6, 3, 5]
console.log(distanceSort([-10,-6,3,5], -10)); //[-10, -6, 3, 5]
console.log(distanceSort([-10,-6,3,5], 5));   //[5, 3, -6, -10]
console.log(distanceSort([-10,-6,3,5], 6));   //[5, 3, -6, -10]
var distanceSort = function distanceSort(nArr, x){
    return nArr.sort(function(n1, n2){
        return Math.abs(n1 - x) - Math.abs(n2 - x);
    });
}

console.log(distanceSort([-10,-6, 57, 54, 11, -34, 203, -140, 3, 5], 1));
//--> [3, 5, -6, 11, -10, -34, 54, 57, -140, 203]
var distanceSort = (nArr, x) => 
    (nArr.sort((n1, n2) =>
        (Math.abs(n1 - x) - Math.abs(n2 - x))));