【问题标题】:Sort an array in such a way that the first element is the largest, the second element is the smallest, and so on. Do without extra space对数组进行排序,使第一个元素最大,第二个元素最小,依此类推。无需额外空间
【发布时间】:2017-09-06 07:58:34
【问题描述】:

问题是:

给定一个未排序的数组,按照第一个元素最大、第二个元素最小、第三个元素第二大等方式对其进行排序。

跟进:你能做到不占用额外空间吗?

例子:

[2, 4, 3, 5, 1] -> [5, 1, 4, 2, 3]

我希望能够在不使用额外空间的情况下对数组进行排序。什么是最有效的解决方案?我只能想到一个 O(n2) 解决方案,它遍历数组以查找下一个最大和下一个最小元素。有没有更有效的解决方案?

我查看了相关问题 Sorting an array with alternate smallest and largest valuesSorting an array with alternate smallest-largest values,但答案对我的问题没有帮助。

【问题讨论】:

  • 为什么链接问题的答案对您的问题没有帮助?最后一个提供了 O(n) 的工作代码,用于在排序后重新排列数组。在一般情况下,排序需要 O(n log n)。虽然如果您知道这些数字是唯一且连续的,您也可以在 O(n) 中进行排序。
  • @JimMischel 我不明白上一个问题中代码背后的逻辑,所以问了一个新问题。

标签: arrays algorithm sorting


【解决方案1】:

前提条件:使用双端队列。

1.对数组进行排序。

循环)

2.pop_back(array) -> 将该元素插入到 i*2 位置。

示例)1、2、3、4、5、6、7

a) 7(插入到 0)-> 1 2 3 4 5 6 => 7 1 2 3 4 5 6

b) 6(插入到 2)-> 7 1 2 3 4 5 => 7 1 6 2 3 4 5

c) 5(插入到 4)-> 7 1 6 2 3 4 => 7 1 6 2 5 3 4(完成)

它的复杂度可能是 O(nlog(n)) + O(n/2)

【讨论】:

  • 那些插页很贵。将 7 插入 0 需要将项目 1-6 向下移动一点。每次插入都是 O(n) 或其一部分。我想你会发现你的算法是 O(n log n) + O(((n/2)^2)/2),这很可能被认为是 O(n^2)。
猜你喜欢
  • 2022-11-16
  • 2021-04-03
  • 2019-08-28
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2020-12-24
相关资源
最近更新 更多