【发布时间】: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。那是现有的算法吗?我现在很容易实现,但我也在为我的代码编写文档,如果存在算法,它会很容易解释。再次感谢
-
我不认为它有名字,情况非常特殊,一开始就有一个特定形状的数组。我认为这种情况发生得不够频繁,以至于没有人给它起名字