将数组排序为“Bell”,“Curve”和“Wave”

时间:2012-12-28 07:34:59

标签: python python-2.7

给出这个值列表:

print samples

[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]

我需要为新的数组长度n生成n个值。这可以这样实现。

for i in range(n):
        My_array.append(random.choice(samples))

现在My_array需要排序,有5种方式:增加,减少,'贝尔','曲线','波'

前两个可以通过

实现
print sorted(My_array,reverse=False)
[5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.0, 9.0, 9.0, 10.0]


print sorted(My_array,reverse=True)
[10.0, 9.0, 9.0, 8.0, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5]

剩下的三个怎么样?

在上面的例子中,'Bell'应该是这样的:

[5.5,6.5,7.0,8.0,9.0,10.0,9.0,8.0,7.5,6.0]

虽然'Curve'应该是这样的:

[9.0,8.0,7.0,6.5,5.5,6.0,7.5,8.0,9.0,10.0]

和'Wave'应该是这样的(如果它是类似cos或类似正弦的波,那真的无关紧要):

[5.5,7.0, 8.0, 10.0, 9.0,7.5, 6.0, 6.5, 8.0, 9.0]

3 个答案:

答案 0 :(得分:3)

对于Wave,您可以遵循Alex的想法:将已排序的数组划分为d个子数组,按升序排序其中一些,然后按降序排序,然后将它们放在一起:

def wave_sort(array, num_peaks=None, start_ascending=True):
    """Sorts the elements of `array` in a sine or cosine manner.

    :param array: The array to be sorted.
    :param num_peaks: The number of (low and high) peaks in the resultant array
    :param start_ascending: If True the result is sin-like, otherwise cos-like.
    """
    if num_peaks is None:
        num_peaks = len(array) // 6
    sorted_ar = sorted(array)
    subarrays = [sorted_ar[i::num_peaks] for i in range(num_peaks)]
    for i, subarray in enumerate(subarrays, start=int(not start_ascending)):
        if i % 2:
            # subarrays are in ascending order already!
            subarray.reverse()
    return sum(subarrays, [])

另一种实现相同目的的方法是将已排序的数组拆分为d/2子数组,并使用Alex L解决方案为每个子数组获取Bell,然后将它们放在一起。

答案 1 :(得分:2)

“贝尔”可以是两个子阵列,一个排序增加其他子阵列。对其他问题继续这个想法。

答案 2 :(得分:2)

Bell / Curve的想法:

>>> ss = sorted(samples)
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> ss[::2]
[5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
>>> ss[-2::-2]
[9.5, 8.5, 7.5, 6.5, 5.5]
>>> ss[-2::-2] + ss[::2]
[9.5, 8.5, 7.5, 6.5, 5.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

另外,如果您要重新排序样本数组,而不是您的方法(将重复项目)

for i in range(n):
        My_array.append(random.choice(samples))

您可以使用:

>>> samples
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> shuffled = samples
>>> random.shuffle(shuffled)
>>> shuffled
[10.0, 6.0, 5.0, 6.5, 7.5, 7.0, 8.0, 8.5, 5.5, 9.0, 9.5]

或列表理解:

My_array = [random.choice(samples) for _ in range(n)]