2015-09-14 33 views
-5

我有需要,當通過了n整數未排序列表中,將返回列表中的功能排序使得:創建一個稍顯陌生的排序功能

  • 指數0將持有的最小數目;
  • 指數n第二小;
  • 指數1第三小;
  • 指數n − 1第四小;
  • 索引2第五小,依此類推。

所以有效訂購往中間的交流,但他們在該列表中的一半上升的項目。

例如,通過7包容, [5,1,2,3給出的無序數字1 ,4,6,7]`,函數將返回:

[1,3,5,7,6,4,2] 
+2

所以你的問題是什麼?使用任何排序算法! –

回答

1

以下是您需要執行的操作。第一步是使用更常規的排序方式對列表進行排序,其中一項將的項目按的順序排列。這可以用Python的就地sort方法來完成:

myList.sort() 

一旦你的[1,2,3,4,5,6,7],您只需創建兩個空列表,然後經過值排序列表順序,交替追加每個項目第一列表或前綴到第二個:

Item List1  List2 
---- ------- ----- 
    1 1 
    2 1   2 
    3 1,3  2 
    4 1,3  4,2 
    5 1,3,5  4,2 
    6 1,3,5  6,4,2 
    7 1,3,5,7 6,4,2 

您可以看到,這兩個列表正在逐步建立根據您的描述。然後,當你完成,你只要加入兩個列表一起,瞧,你有它:現在

1,3,5,7,6,4,2 

,如果這是課堂作業,我勸你去嘗試,並在你的腦袋上運行的算法(或者用筆和紙)來理解它,然後自行編碼 - 這會讓你成爲一個更好的開發者。

但是,如果您只是需要代碼,請參閱下面的概念證明。


# Initial list, then conventional sort. 

myList = [5,1,2,3,4,6,7] 
myList.sort() 

#Create two empty lists, flag to append to first. 

listFront = [] 
listBack = [] 
intoFirst = True 

# Process every item in conventionally sorted list. 

for item in myList: 
    # Either append to list 1 or prefix list 2. 

    if intoFirst: 
     listFront.append(item) 
    else: 
     listBack.insert(0,item) 

    # Alternate between lists 1 and 2. 

    intoFirst = not intoFirst 

# Append two lists to get desired sort order. 

myList = listFront + listBack 
print(myList) 
+0

非常感謝。它幫助我理解了算法。 – Nick

+0

你能解釋一下爲什麼你把'0'放在這裏:listBack.insert(0,item)? – Nick

+0

@Nick,它是你想要插入的索引。要在列表的開始處插入,請使用零。 – paxdiablo

0

您可以創建一個可生成序列[0, -1, 1, -2, 2, ...],然後使用該索引到的解決方案發電機,這將與任何長度的列表的工作:

>>> from itertools import count, izip 
>>> l = [5,1,2,3,4,6,7] 
>>> i = (x for y in izip(count(0,1), count(-1,-1)) for x in y) 
>>> sol = [0]*len(l) 
>>> for v in sorted(l): 
...  sol[next(i)] = v 
>>> sol 
[1, 3, 5, 7, 6, 4, 2] 

或者,您也可以生成奇數長度列表的序列[0,2,4,6,-2,-4,-6]和偶數長度列表的[0,2,4,6,-1,-3,-5,-7] ,並使用列表理解來生成解決方案:

>>> from itertools import count 
>>> l = [5,1,2,3,4,6,7] 
>>> s = sorted(l) 
>>> up = count(0,2) 
>>> down = count(-2 if len(l)%2 else -1, -2) 
>>> i = (next(up if x < len(l)/2 else down) for x in range(len(l))) 
>>> [s[x] for x in i] 
[1, 3, 5, 7, 6, 4, 2] 

我敢肯定有更簡單的方法來產生這些序列...