2010-09-30 55 views
0

誰能告訴我爲什麼我的程序工作怪異。我正在嘗試按升序對list1進行排序。此代碼是我正在編寫的快速排序程序的一部分。按照我在這段代碼中應用的邏輯,我也手動檢查過,輸出應該是[1,2,3,4,5]。但是輸出結果是[1,2,2,4,5]。你能告訴出了什麼問題嗎?輸出錯誤 - 按我的邏輯

list1=[3,2,1,5,4] 
n_list1=len(list1) 
count=0 

for position1, item1 in enumerate(list1[0:n_list1]): 
    temp=item1 
    count=count+1 
    for position2 in range(count,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1]=list1[position2] 
      list1[position2]=temp 
      temp=list1[position1] 
print list1 

編輯:我所試圖做的是這樣的:

我開始的第一個元素具有以下(N-1)的元素比較,並與第一個交換的最小元素。現在我轉到第二個元素,並將其與以下(n-2)個元素進行比較,並與這些(n-2)個元素中的最小元素進行交換。像這樣我前進。

注意:這是我的quicksort程序的一部分,它本身不是quicksort。這部分是針對list1,我指定的數字小於樞軸。另一個代碼將用於list2,我將分配大於數據透視的數字。

回答

2

由RBP提供的答案是絕對正確的!

另外,我想你可以簡化由remove計數本身上面,也直接枚舉列表,並使用Python成語 - A,B = B,A來交換值

list1=[3,2,1,6,5,4] 
n_list1 = len(list1) 
for position1, item1 in enumerate(list1): 
    for position2 in range(position1,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1] , list1[position2] = list1[position2], list1[position1] 
print list1 

輸出:

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

[編輯:關於成語]

>>> a = 4 
>>> b = 5 
>>> a , b = b, a 
>>> a 
5 
>>> b 
4 
>>> c = 5 
>>> d = 6 
>>> t = c 
>>> c = d 
>>> d = t 
>>> c 
6 
>>> d 
5 
>>> 
+0

@Harpreet:看到我編輯的答案 – pyfunc 2010-09-30 20:43:13

4

由於您在for的最前面做了count = count + 1,所以您永遠無法到達list1(list1[0])的第一個位置,即元素「3」。

[編輯]你的代碼看更仔細,似乎有很多混亂。例如,在

 list1[position1]=list1[position2] 
     list1[position2]=temp 
     temp=list1[position1] 

你失去list1的[位置1]:你用列表覆蓋它[情況2],試圖將其保存在臨時變量之前。嘗試將temp=list1[position1]移至if之後的第一行。

而且,說實話,你的實現是過於複雜。我建議你嘗試用僞代碼寫它,試着真正理解發生了什麼,然後重新實現它。

+0

這並不符合你的想法。正如我在編輯中提到的,你正在跳過太多的箍。看看Jon Bentley的實現,非常乾淨,應該讓你更好地理解quicksort:http://www.youtube.com/watch?v = aMnn0Jq0J-E(如果你有權限的話,它也在「Beautiful Code」一書中) – rbp 2010-09-30 20:18:09

+0

另一個小點:enumerate(list1 [0:len(list1)])與enumerate(list1)基本相同。 。 – rbp 2010-09-30 20:18:54

+0

我想要做的是這樣的:我開始比較第一個元素與下面的(n-1)個元素,並將第一個元素與最小的元素交換。現在我轉到第二個元素,並將其與以下(n-2)個元素進行比較,並與這些(n-2)個元素中的最小元素進行交換。像這樣我前進。 – Pupil 2010-09-30 20:23:53

0

小的改進,以pyfunc的正確答案... 此行

for position2 in range(position1,n_list1) 

可以

for position2 in range(position1+1,n_list1) 

,將節省您的時間。