【问题标题】:How do I sort an array of integers in php or JavaScript?如何在 php 或 JavaScript 中对整数数组进行排序?
【发布时间】:2019-05-06 10:47:17
【问题描述】:

给定一个整数数组,对数组进行排序,arr1 >= arr2 <= arr3 >= arr4 <= arr5 ... 然后返回数组

例子:

给定[1,2,3,4]

可能的结果:

1:[2,1,4,3]

2:[4,1,3,2]

【问题讨论】:

  • 这是理论上的(即排序算法),还是您心中有特定的语言?
  • 仔细想想,这个问题没有意义。给定一个排序数组,并期待两个未排序数组之一?
  • 我需要一个用 php 或 javascript 编写的算法
  • 您应该使用searched google 而不是询问堆栈溢出问题。如果您希望在此处获得帮助,则必须付出更多努力(即提供实施的开始)并寻求具体指导。
  • @JonathanWilson 好吧,阅读并尝试理解 OP 的含义会很有帮助,而不仅仅是盲目地判断它们或 LMGTFY。由于语言问题或缺乏经验,并不是每个人都能清楚地表达自己的想法,也不是惩罚他们的理由。

标签: javascript php arrays sorting


【解决方案1】:

这就是我将如何实现它,最天真的方式:

const arr = [4, 2, 1, 3, 5];

const sorted = arr.sort((a, b) => a - b);

const left = sorted.slice(0, sorted.length / 2);
const right = sorted.slice(sorted.length / 2);

const merged = [];

for (let i = 0; i < right.length; ++i) {
  merged.push(right[i]);
  if (i < left.length) {
    merged.push(left[i]);
  }
}

console.log(merged);

它的作用:

  1. 它首先对数组进行排序,以确保它完全有序
  2. 然后将其拆分为 2 侧,尽可能均匀:左侧和右侧。对于奇数的项目,权利会更长
  3. 然后它从任一侧一个接一个地合并它们

视觉解释:

初始状态:

left        right
[1, 2]      [3, 4, 5]

合并:

第 1 步:

left        right
[1, 2]      [4, 5]

merged
[3]

第 2 步:

left        right
[2]         [4, 5]

merged
[3, 1]

第 3 步:

left        right
[2]         [5]

merged
[3, 1, 4]

第 4 步:

left        right
[]          [5]

merged
[3, 1, 4, 2]

第 5 步:

left        right
[]          []

merged
[3, 1, 4, 2, 5]

【讨论】:

  • 非常感谢@zerkms,您的解决方案也很有效而且速度也很快。 ?
【解决方案2】:

从排序数组开始:

sort($numbers);

通过交替从输入数组的开头和结尾获取数字,将数字附加到结果数组。

$i = 1;

// remove elements from $numbers array until it is empty
while ($numbers) {

    if ($i++ % 2) {

        // on odd iterations, pull an item from the end of $numbers (highest numbers)
        $result[] = array_pop($numbers);
    } else {

        // on even iterations, pull an item from the beginning of $numbers (lowest numbers)
        $result[] = array_shift($numbers);
    }
}

【讨论】:

  • @DontPanic 您的解决方案很好,但是有一个错误。您应该预先增加 $i 而不是后增加。
  • 哦,那不是先放一个较小的数字吗?
  • @DontPanic 不,它不会,它实际上会把最高的数字放在第一位,因为在第一次迭代中使用 Pre-increment 你的模数 if 语句看起来像 1 / 2 你有余数.
  • 记录在案,在修复错误后,您的解决方案运行得更快,这就是我要使用的解决方案。谢谢。 ???
  • 哎呀,是的,你是对的。我重写了它与我运行的示例不同以使其更清晰,但在此过程中不小心切换了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多