使用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))));