对整数数组进行排序,保持原位

时间:2017-06-08 15:52:08

标签: javascript sorting

如何按如下方式对数组进行排序:

[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]到位
  • 下一个最高整数(如果有的话)
  • 然后从最低整数
  • 升序

6 个答案:

答案 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)

我的建议基于:

  • 将原始数组减少为包含第一个数字的较低和较高数字的两个
  • 对每个数组进行排序并连接

通过这种方式,最初的问题分为两个更容易处理的子问题。

&#13;
&#13;
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;
&#13;
&#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);