我有需要,當通過了n
整數未排序列表中,將返回列表中的功能排序使得:創建一個稍顯陌生的排序功能
- 指數
0
將持有的最小數目; - 指數
n
第二小; - 指數
1
第三小; - 指數
n − 1
第四小; - 索引
2
第五小,依此類推。
所以有效訂購往中間的交流,但他們在該列表中的一半上升的項目。
例如,通過7
包容,
[5,1,2,3給出的無序數字1
,4,6,7]`,函數將返回:
[1,3,5,7,6,4,2]
我有需要,當通過了n
整數未排序列表中,將返回列表中的功能排序使得:創建一個稍顯陌生的排序功能
0
將持有的最小數目;n
第二小;1
第三小;n − 1
第四小;2
第五小,依此類推。所以有效訂購往中間的交流,但他們在該列表中的一半上升的項目。
例如,通過7
包容,
[5,1,2,3給出的無序數字1
,4,6,7]`,函數將返回:
[1,3,5,7,6,4,2]
以下是您需要執行的操作。第一步是使用更常規的排序方式對列表進行排序,其中一項將的項目按的順序排列。這可以用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, -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]
我敢肯定有更簡單的方法來產生這些序列...
所以你的問題是什麼?使用任何排序算法! –