【问题标题】:Best algorithm to sort an array with inversions用反转对数组进行排序的最佳算法
【发布时间】:2017-03-22 16:25:26
【问题描述】:

我正在一个处理数据的程序中工作。但是,因为我希望我的代码高效,所以我想要一个排序算法,它的运行时间不依赖于数组的反转次数,因此我可以按升序对其进行排序。 数组的顺序总是:

  • n = 数组的大小

  • 列表 = (1,2,3,...,(n/2 -1), (n/2),(n/2 + 1),...3,2 ,1

我知道数组的反转总数等于:

  • (n/2 -1) + (n/2 -2) + (n/2 - 3) +...+ 1

我认为 对称数组 有很多反转,因为我知道数组的顺序总是这样,所以我想要一种算法在 O(n) 时间内对它们进行排序。我知道插入排序的复杂性取决于数组的反转次数,但我不确定数组的反转次数取决于 n

【问题讨论】:

  • 如果你知道数组是对称的并且你知道每一边都是排序的(在相反的方向上),我看不出问题(?)
  • 对不起,我忘了提到我希望它按升序排序。我现在就编辑它
  • 我可能会误解和错了,但你能不能从一开始就遍历数组的前半部分,然后把所有的东西都喂两次?即创建一个与输入相同大小的输出数组。然后遍历输入数组直到中点。在遇到的每个元素处将其放入输出数组两次。
  • 感谢帮助很多的人:D。那是现有的算法吗?我现在很容易实现,但我也在为我的代码编写文档,如果存在算法,它会很容易解释。再次感谢
  • 我不认为它有名字,情况非常特殊,一开始就有一个特定形状的数组。我认为这种情况发生得不够频繁,以至于没有人给它起名字

标签: arrays sorting symmetric


【解决方案1】:

由于您的数字处于固定范围 (0, n/2-1),因此您可以使用任何范围排序算法,例如计数排序。见Non-comparision_sorts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2011-11-27
    • 2017-05-23
    • 1970-01-01
    • 2014-09-16
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多