2016-11-13 15 views
0

基本上我一直在嘗試的是,我從未排序的列表中選出最小和最大的,然後將它們附加到一個新列表中,然後從舊的未排序列表中彈出最小和最大的列表,直到我結束了一個排序列表。請看看我的代碼。我的排序算法在Python中有時會在運行時凍結,有人可以看看嗎?

import random 
import time 

stack = [] #sorted list 
numbersarray = [] #unsorted list 

usersize = int(input("How many digits do you want in your array? ")) #numberofinputs 
limit = 0 
counter = 0 


while limit <= usersize: 
    numbersarray.append(random.randint(0,20)) #randomly input numbers into array 
    limit = limit + 1 

print(numbersarray) #prints the current unsorted array 
start_time = time.time() #starts clock 

subtractor = 0 #used later in code for changing index 
while len(numbersarray) != 0: 
    i = 0 
    largest = numbersarray[i] 
    size = len(numbersarray) -1 
    smallest = numbersarray[i] 

while (i < len(numbersarray)): 
    if numbersarray[i] >= largest: 
     largest = numbersarray[i] 
     index = i 
    elif numbersarray[i] <= smallest: 
     smallest = numbersarray[i] 
     indextwo = i 
    i = i+1 

if (len(numbersarray) == 1): #this checks if there's only 1 number left. 
    entry = int(stacksize/2 + 1) 
    stack.insert(entry,numbersarray[0]) 
    break 
else: 
    if indextwo > index: 
     numbersarray.pop(indextwo) 
     numbersarray.pop(index) 
    elif index > indextwo: 
     numbersarray.pop(index) 
     numbersarray.pop(indextwo) 

stacksize = len(stack) 
if stacksize == 0: 
    stack.append(smallest) 
    stack.append(largest) 
elif stacksize != 0: 
    stack.insert(stacksize-subtractor,largest) #the subtractor is dynamically changing the index of insertion. 
    stack.insert(0+subtractor,smallest) 
subtractor = subtractor + 1 

print(stack) 
print("--- %s seconds ---" % (time.time() - start_time)) 

回答

1

你有一個while循環中,你掃描整個陣列爲maxmin秒,然後繼續從任意位置列表.pop元素雙重嵌套。

考慮到popO(N)複雜度不在列表末尾;您的方法效率非常低,會傳出/凍結usersize的較大值。這就是爲什麼,我猜測,當usersize很大時,標題中的「有時」會發生。

總之,這是一個你需要找到一個更好的算法來解決你的問題的情況。

+0

我看到發生了什麼,好吧,我一定會考慮一下。我是一名初學者編碼員,所以我只是在教自己排序算法,這就是爲什麼這麼糟糕,謝謝! –

相關問題