彩票插入排序算法

问题描述

在我的彩票游戏中,我需要创建1000名玩家,每个玩家都有一个号码集,需要将其与获胜号码集进行比较。所有数字集均来自0-30个数字的桶。我已经完成了这一部分,但是现在我需要将玩家编号分为两个组,称为PWN和SWN。 PWN是前6个数字,SWN是后两个数字。我需要使用插入排序对PWN进行排序,并使用选择排序对SWN进行排序。我仍然没有参加SWN部分,因为我仍然想找出PWN排序。

for example my program create something like below
Winning number 
19,27,23,18,1,3,2,24

Player ID | Player Numbers
 1        | 8,14,4,10,21,22
 2        | 13,22,9,11,29,16,27
 3        | 10,25,26,8,5,18

but I need to sort them like 
Winning number 

    PWN                |    SWN
19,3   |   2,24

Player ID | Player Numbers PWN        | Player Numbers SWN
 1        | 8,21       |  2,29     |  16,5      |  23,18
import random

#main code to generate data in the program starts here
def generaterandomNumber():
    randomNumber = random.randint(0,30) #can return numbers between 0 and 30 including 0 and 30
    return randomNumber#return Random numbers

def drawWinningLotteryNumber():#this function generates the winning numbers
    lotteryDrawNumbers = []#list containner for the generated lottery numbers
    for currentLotteryNumber in range(8):#for loop to keep generating for 8 counts
        randomNumber = generaterandomNumber()# call funtion to generate random numbers
        lotteryDrawNumbers.append(randomNumber)# add to the back of the list

    return lotteryDrawNumbers#return the list
    
def printWinningLotteryNumber(lotteryDrawNumbers):#ths function prints the winning numbers
    for currentLotteryNumberIndex in range (len(lotteryDrawNumbers)):#for loop to run the print funtion for the length of the list
        print(lotteryDrawNumbers[currentLotteryNumberIndex],end = " ")#prints the numbers

def draw():# this funtion brings to gether the draw funtion and prints it
    
    lotteryNumbers = drawWinningLotteryNumber()#call function to draw winning numbers
    print ("The 8 lottery number for today are :")
    printWinningLotteryNumber(lotteryNumbers)#call funtion to print the generated numbers

def generateID():#this function creates the lotto players and their numbers
    players = {}

    for player_id in range(1,1001):
        player_list = []
        for i in range(8):
            player_list.append(generaterandomNumber())
        players[player_id] = player_list

    for player_id in players:
        print("Player {} has numbers {}".format(player_id,players[player_id]))
    pwnSort(players)
    
#data generating code ends here
def pwnSort(players):
    

    for i in range(1,len(players)): 
  
        key = players[i] 
  
       
        j = i-1
        while j >=0 and key < players[j] : 
                players[j+1] = players[j] 
                j -= 1
        players[j+1] = key 

generateID()

draw()

当我运行此代码时,它会创建数据并卡住,并在pwnSort()给出以下内容

Player 984 has numbers [14,9]
Player 985 has numbers [28,15,19,30,2]
Player 986 has numbers [6,13,2]
Player 987 has numbers [29,28,20]
Player 988 has numbers [6,20,15]
Player 989 has numbers [29,17,8]
Player 990 has numbers [12,23]
Player 991 has numbers [18,12,6,24]
Player 992 has numbers [4,24,3]
Player 993 has numbers [24,6]
Player 994 has numbers [19,7,6]
Player 995 has numbers [1,2]
Player 996 has numbers [26,20]
Player 997 has numbers [19,8]
Player 998 has numbers [19,21]
Player 999 has numbers [15,30]
Player 1000 has numbers [8,16]
Traceback (most recent call last):
  File "E:/User Profile/Documents/ACBT/Data Sturctures/assignment.py",line 83,in <module>
    generateID()
  File "E:/User Profile/Documents/ACBT/Data Sturctures/assignment.py",line 37,in generateID
    pwnSort(players)
  File "E:/User Profile/Documents/ACBT/Data Sturctures/assignment.py",line 49,in pwnSort
    while j >=0 and key < players[j] :
KeyError: 0

我能知道为什么以及如何解决这个问题

解决方法

while方法内的pwnSort循环的条件中有错误。

循环的条件是j >= 0 and key < players[j],但是您声明的是j = i-1,因此在第一次迭代时,j的值将是0。错误players指出,在0词典中没有名为KeyError: 0的键。

要解决此问题,只需将条件更改为:j > 0 and key < players[j]

最终功能将如下所示:

def pwnSort(players):
    for i in range(1,len(players)): 
        key = players[i] 

        j = i-1
        while j > 0 and key < players[j]:
            players[j+1] = players[j] 
            j -= 1
        players[j+1] = key