選擇排序迭代-python
阿新 • • 發佈:2020-08-26
簡單選擇排序:
import random
m=[x+1 for x in range(9)]
random.shuffle(m)
awe=[
m,
[x for x in range(1,10)],
[x-1 for x in range(10,1,-1)],
[1 for x in range(9)]
]
print(awe,end='\n')
for v in awe:
count_iter=0
count_swap=0
for b in range(len(v)):
maxIndex=b
for c in range(b+1,len(v)):
count_iter+=1
if v[maxIndex] < v[c]:
maxIndex=c
if b != maxIndex:
count_swap+=1
v[b],v[maxIndex]=v[maxIndex],v[b]
print(v,count_iter,count_swap,end='\n')
print(awe)
二元選擇排序:
import random
m=[x+1 for x in range(9)]
random.shuffle(m)
awe=[
m,
[x for x in range(1,10)],
[x-1 for x in range(10,1,-1)],
[1 for x in range(9)]
]
print(awe,end='\n')
for v in awe:
count_iter=0
count_swap=0
for b in range(len(v)//2):
maxIndex=b
minIndex=-b-1
minOrigin=minIndex # 記錄最小索引的原始記錄
# 迭代尋找最大值索引和最小值索引
for x in range(b+1,len(v)-b):
count_iter+=1
if v[maxIndex] < v[x]:
maxIndex=x
if v[minIndex] > v[-x-1]:
minIndex=-x-1
# 進行最大值的交換
if b != maxIndex:
v[maxIndex],v[b]=v[b],v[maxIndex]
count_swap+=1
# 如果b為最小值,那麼肯定被交換,且對最小值交換造成影響,需更正最小值索引
# minIndex == b 為正索引情況,minIndex == b-len(v)為負索引情況
if minIndex == b or minIndex == b-len(v):
minIndex=maxIndex
# 進行最小值的交換
if minIndex != minOrigin:
count_swap+=1
v[minIndex],v[minOrigin]=v[minOrigin],v[minIndex]
print(v,count_iter,count_swap,end='\n')
print(awe)
加入等值元素,和minOrigin索引對應值發生改變的情況,進一步改進演算法
import random
m=[x+1 for x in range(9)]
random.shuffle(m)
awe=[
m,
[x for x in range(1,10)],
[x-1 for x in range(10,1,-1)],
[1 for x in range(9)],
[1,1,1,1,1,1,1,1,1,2]
]
print(awe,end='\n')
for v in awe:
count_iter=0
count_swap=0
for b in range(len(v)//2):
maxIndex=b
minIndex=-b-1
minOrigin=minIndex # 記錄最小索引的原始記錄
# 迭代尋找最大值索引和最小值索引
for x in range(b+1,len(v)-b):
count_iter+=1
if v[maxIndex] < v[x]:
maxIndex=x
if v[minIndex] > v[-x-1]:
minIndex=-x-1
# 最大索引值和最小索引值相等,說明剩下的所有元素相等
if v[maxIndex] == v[minIndex]:
break
# 進行最大值的交換
if b != maxIndex:
v[maxIndex],v[b]=v[b],v[maxIndex]
count_swap+=1
# 如果b為最小值,那麼肯定被交換,且對最小值交換造成影響,需更正最小值索引
# minIndex == b 為正索引情況,minIndex == b-len(v)為負索引情況
if minIndex == b or minIndex == b-len(v):
minIndex=maxIndex
# 進行最小值的交換,進行最大索引值交換時,可能對minOrigin索引對應的值進行交換,加入判斷減少交換
if minIndex != minOrigin and v[minIndex] != v[minOrigin]:
count_swap+=1
v[minIndex],v[minOrigin]=v[minOrigin],v[minIndex]
print(v,count_iter,count_swap,end='\n')
print(awe)