如何按如下方式对数组进行排序:
[10, 7, 12, 3, 5, 6] --> [10, 12, 3, 5, 6, 7]
[12, 8, 5, 9, 6, 10] --> [12, 5, 6, 8, 9, 10]
答案 0 :(得分:8)
您可以保存第一个元素的值,并在第一个排序增量的条件中使用它。然后按标准delta进行排序。
工作原理(排序顺序来自Edge)
condition numerical sortFn a b delta delta result comment ----- ----- --------- --------- --------- ----------------- 7 10* 1 1 different section 12* 7 -1 -1 different section 12* 10* 0 2 2 same section 12* 7 -1 -1 same section 3 7 0 -4 -4 same section 3 12* 1 1 different section 3 7 0 -4 -4 same section 5 7 0 -2 -2 same section 5 12* 1 1 different section 5 3 0 2 2 same section 5 7 0 -2 -2 same section 6 7 0 -1 -1 same section 6 3 0 3 3 same section 6 5 0 1 1 same section 6 7 0 -1 -1 same section * denotes elements who should be in the first section
不同部分的元素表示其中一个元素进入第一部分,另一部分进入第二部分,该值由条件的增量取得。
相同部分的元素意味着,两个元素属于同一部分。对于排序,返回值的增量。
function sort(array) {
var first = array[0];
array.sort(function (a, b) {
return (a < first) - (b < first) || a - b;
});
return array;
}
console.log(sort([10, 7, 12, 3, 5, 6]));
console.log(sort([12, 8, 5, 9, 6, 10]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:3)
一个简单的解决方案可能是对整个数组进行排序,然后根据您的初始第一个元素对结果数组进行分区。
即
[10, 7, 12, 3]
排序为[3, 7, 10, 12]
>= 10
和< 10
:[10, 12]
和[3, 7]
[10, 12, 3, 7]
没有抛光的示例实现:
function customSort(input) {
var firstElem = input[0];
var sortedInput = input.sort(function(a, b) { return a-b; });
var firstElemPos = sortedInput.indexOf(firstElem);
var greaterEqualsFirstElem = sortedInput.splice(firstElemPos);
var lessThanFirstElem = sortedInput.splice(0, firstElemPos);
return greaterEqualsFirstElem.concat(lessThanFirstElem);
}
console.log(customSort([10, 7, 12, 3, 5, 6]));
console.log(customSort([12, 8, 5, 9, 6, 10]));
console.log(customSort([12, 8, 5, 9, 12, 6, 10]));
console.log(customSort([12]));
console.log(customSort([]));
答案 2 :(得分:1)
请看下面的代码段。
这很简单。只需将arrary中的第一个元素移到新数组中即可。
对数组的其余部分进行排序,并检查此数组的最大值是否大于第一个元素。
如果是,那么将其推入结果档案。否则使用结果数组
对数组进行concat
var input1 = [10, 7, 12, 3, 5, 6];
var expected1 = [10, 12, 3, 5, 6, 7];
var input2 = [12, 8, 5, 9, 6, 10];
var expected2 = [12, 5, 6, 8, 9, 10];
function customSort(aInput) {
var aResult = [aInput.shift()];
aInput = aInput.sort(function(a, b) { return a - b;});
if (aInput[aInput.length - 1] > aResult[0]) {
var iMax = aInput.pop();
aResult.push(iMax);
}
aResult = aResult.concat(aInput);
return aResult;
}
console.log("Expected: ", expected1.toString());
console.log("Sorted: ", customSort(input1).toString());
console.log("Expected: ", expected2.toString());
console.log("Sorted: ", customSort(input2).toString());
答案 3 :(得分:0)
更新**
它不能与array.concat一起使用但是使用这个合并功能,不知道为什么......
这是一种解决方案,
Array.prototype.merge = function(/* variable number of arrays */){
for(var i = 0; i < arguments.length; i++){
var array = arguments[i];
for(var j = 0; j < array.length; j++){
if(this.indexOf(array[j]) === -1) {
this.push(array[j]);
}
}
}
return this;
};
var $a = [10, 7, 12, 3, 5, 6];
var $b = [12, 8, 5, 9, 6, 10];
function reorganize($array){
var $reorganize = [];
$reorganize.push($array.shift());
$array.sort(function(a, b) { return a - b; });
$reorganize.merge($array);
return $reorganize;
}
console.log(reorganize($a));
console.log(reorganize($b));
答案 4 :(得分:0)
我的建议基于:
通过这种方式,最初的问题分为两个更容易处理的子问题。
function cSort(arr) {
var retval = arr.reduce(function (acc, val) {
acc[(val < arr[0]) ? 1 : 0].push(val);
return acc;
}, [[], []]);
return retval[0].sort((a, b) => a-b).concat(retval[1].sort((a, b) => a-b));
}
//
// test
//
console.log(cSort([10, 7, 12, 3, 5, 6]));
console.log(cSort([12, 8, 5, 9, 6, 10]));
console.log(cSort([12, 8, 5, 9, 12, 6, 10]));
console.log(cSort([12]));
console.log(cSort([]));
&#13;
答案 5 :(得分:0)
我正在使用Java:
int[] arr = {10, 7, 12, 3, 5, 6};
List<Integer> arr_1 = new ArrayList<Integer>();
for(int i = 0; i < arr.length; i++)
{
arr_1.add(arr[i]);
}
Collections.sort(arr_1.subList(1,arr_1.size()));
System.out.println(arr_1);