2017-03-17 5 views
0

J'essaie de créer un tableau de 7 nombres générés aléatoirement, puis de trier ces nombres du plus petit au plus élevé en utilisant la méthode de tri d'insertion. J'ai regardé à travers plusieurs sujets précédemment répondus car c'est une question très commune mais chaque utilisateur a un code très différent à moi qui me fait me demander où je vais mal.Indice de liste d'erreurs d'insertion par insertion

import random # importing the random module 
arrayInsertion = [] 

for i in range (7): # 7 different numbers 
    arrayInsertion.append(random.randint (1,10)) 

for i in range (1,7): 
    while i > 0 and arrayInsertion [i+1] > arrayInsertion [i]: 
     arrayInsertion [i] = arrayInsertion [i-1] 
     i = i - 1 
print (arrayInsertion) 

Lors de l'exécution de ce code, je reçois le message d'erreur suivant:

Traceback (most recent call last): File "C:\Users\Ben\Desktop\insertion sort.py", line 8, in while i > 0 and arrayInsertion [i+1] > arrayInsertion [i]: IndexError: list index out of range

+0

Utilisez-vous 'i + 1' quand vous voulez utiliser' i-1'? – Blckknght

Répondre

1

Le problème est arrayInsertion[i + 1] quand i = 7 alors i est hors des limites, car il n'y a que 7 éléments dans la liste. Vous ne vous souvenez pas non plus de la valeur et de l'indice actuels.

for i in range(1, len(arrayInsertion)): 
    curr = arrayInsertion[i] 
    pos = i 
    while pos > 0 and arrayInsertion[pos - 1] > curr: 
     arrayInsertion[pos] = arrayInsertion[pos - 1] 
     pos -= 1 
    arrayInsertion[pos] = curr 

qui donne correctement:

[5, 5, 5, 6, 6, 8, 9]

Pour une utilisation ultérieure envisager l'emballage en fonction def insertion_sort(a).

0
def insert_sort(list_input): 
    for unsorted_id in range(len(list_input)): 
     element = list_input[unsorted_id] 
     sorted_id = unsorted_id - 1 
     while sorted_id >= 0 and element > list_input[sorted_id]: 
      list_input[sorted_id + 1] = list_input[sorted_id] 
      sorted_id -= 1 
     list_input[sorted_id + 1] = element 
    return list_input 
+1

Bienvenue sur [donc]. S'il vous plaît examiner [réponse]! Les réponses au code seulement sont moins utiles que celles qui expliquent comment elles fonctionnent et pourquoi elles sont meilleures que le code OP affiché. – TemporalWolf

0

vous pourriez aussi utiliser le construit dans la méthode .Sort()

0
for i in range(1,7) 

Above line of code will produce 1 to 6 sequentially (1,2,3,4,5,6)

while i > 0 and arrayInsertion [i+1] > arrayInsertion [i] 

arrayInsertion [i+1] in above line in try to access arrayInsertion[7] for i = 6 which is not present

Donc, il va jeter IndexError: liste des index hors de portée