zl程序教程

您现在的位置是:首页 >  后端

当前栏目

选择排序迭代-python

2023-09-11 14:16:17 时间

  

简单选择排序:

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)