1. 程式人生 > 實用技巧 >選擇排序迭代-python

選擇排序迭代-python

  

簡單選擇排序:

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)