2012-12-28 2 views
2

:정렬 배열 '웨이브'값의 목록을 감안할 때

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 가지 방법으로 정렬 : 증가, '벨', '곡선'감소 '웨이브'

첫 번째 2

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] 

방법에 의해 달성 될 수있다

나머지 세명 은요? 위의 예에서, '벨에서

이렇게 같아야

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

'곡선 '이 같아야 동안 :

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

와'웨이브 '이 같아야 (IT

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

'Wave'에 대한 샘플 출력을 더 많은 요소로 표시 할 수 있습니까? 내 말은, 웨이브에는 항상 두 종의 종이 있거나, 종 종의 크기가 고정되어 있어야하며 요소의 수가 증가해야합니까? – Bakuriu

+0

웨이브 [9.0, 9.0, 8.5, 7.5, 6.5, 6.5, 6.0, 5.0, 5.0, 5.0, 5.5,7.5,7.5,9.0,10.0,10.0,10.0,10.0,8.5,6.5,6.0,5.5,0.05, 5.05, 5.0, 8.0, 9.0, 9.5, 9.5, 10.0] 파도 형성에 대해서는 신경 쓰지 않고 단지 '봉우리'와 '최저'가 있어야합니다. – poscaman

답변

3

당신이 알렉스 L의 생각을 따를 수 웨이브의 경우 : 내림차순으로 오름차순 및 다른 사람, 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을 얻은 다음 함께 배치하는 것입니다.

2

"벨"은 두 개의 하위 배열, 하나의 정렬 된 increa 다른 감소를 노래하십시오. 다른 문제에 대해서는이 아이디어를 계속 진행하십시오.

2

벨/곡선에 대한 생각 :

>>> 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)]  
+0

My_array.append에 'samples' random.choice (샘플)). 나는 지금 그것을 바로 잡았다.My_array는 n 개의 샘플을 포함해야합니다. 그 외에도 귀하의 접근 방식을 테스트 중이며 작동합니다. 감사! – poscaman