我對用python撰寫的陣列進行排序的方法:
array = [3, 2, 1]
for i in range(len(array)):
minVal = array[i]
for j in range(i 1, len(array)):
if (array[j] < array[i]):
if (array[j] <= minVal):
minVal = array[j]
if i < len(array) - 1:
array[i 1] = array[i]
array[i] = minVal
print(array)
我認為它如何作業?
第一個回圈將執行 3 次第
一次迭代:
#i will check number 3 with numbers 2 and 1
#expected output:
minVal = 1
array = [1, 3, 2]
第二次迭代:
#i will check number 3 with number 2
#expected output:
minVal = 2
array = [1, 2, 3]
最后一次迭代:
#I do not know if he is needed.
#perhaps it is worth writing `range(len(array) - 1)` in the first loop?
#and because of this iteration, I also added the check `if i <len (array) - 1:`
最后的預期輸出:[1, 2, 3]
我得到了什么:[1, 1, 3]
uj5u.com熱心網友回復:
想想你的邏輯:你找到最小值,然后i用它替換專案,但只將i專案的第一個索引提前到i 1。通過這樣做,在第一次迭代后,您的串列為[1, 3, 1]. 讓我們分解一下:
- 你從
[3, 2, 1] minVal = array[i] = 3- 回圈之后
j我們發現minVal = 1 - 現在我們做
array[i 1] = array[i] -> array[1] = 3。所以現在我們有了[3, 3, 1]. - 現在我們做
array[i] = minVal -> array[0] = 1。所以現在我們有了[1, 3, 1].
該元素2已從串列中消失!
要解決此問題,您需要保存minVal的索引并替換這兩項,而不是覆寫另一項:
array = [3, 2, 1]
for i in range(len(array)):
minIndex = i
for j in range(i 1, len(array)):
if (array[j] < array[i]):
if (array[j] <= array[minIndex]):
minIndex = j
minVal = array[minIndex]
if i < len(array) - 1:
array[minIndex] = array[i]
array[i] = minVal
print(array)
現在有一些要點可以簡化和改進您的代碼:
- 無需
array[j] < array[i]在每次迭代時檢查 - 在第一次迭代中它等于minVal/array[minIndex]無論如何,因此您可以洗掉一個if. - 不需要最后一個
if- 如果我們到達最后一個元素,而不是檢查每次迭代,只需將其從回圈中洗掉 -for i in range(len(array)-1)。 - 替換可以在一行中完成,甚至不需要保存
minVal- 請參閱這個 SO question。
所以根據上面的改進版本可以是:
array = [3, 2, 1]
for i in range(len(array)-1):
minIndex = i
for j in range(i 1, len(array)):
if array[j] < array[minIndex]:
minIndex = j
array[minIndex], array[i] = array[i], array[minIndex]
print(array)
uj5u.com熱心網友回復:
您當前正在一個陣列中搜索最小值,包括并超過當前索引。這是一種O(N^2)方法,而且非常穩健。但是,您需要正確實施它。
支票
if (array[j] < array[i]):
if (array[j] <= minVal):
是多余的。您不應該將您的測驗限制在原始最小值,盡管它沒有害處,因為minVal <= array[i]在所有情況下。
你并不像關心它的位置那樣關心它的價值。minVal您或多或少正確識別minVal為array[j],但隨后將其換成array[i 1] = array[i]。正確的j記錄在哪里?
這是相同的想法,但沒有額外的檢查,并minJ用于說明jvs 值的快取:
array = [3, 2, 1]
for i in range(len(array) - 1): # Don't bother iterating the last element
min_j = i # Only record indices
for j in range(i 1, len(array)):
if array[j] < array[min_j]: # Only test current minimum
min_j = j
array[i], array[min_j] = array[min_j], array[i]
print(array)
幾個小調整:
- 您不需要遍歷最后一個元素,因此將外部元素縮短
range一。 - 在 python 中交換兩個數量的慣用方式是
x, y = y, x. 如果無論如何你要使用一個臨時變數,它也可能是一個增強易讀性的元組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411327.html
標籤:
上一篇:為什么我的快速排序功能沒有運行?
