Форум сайта python.su
Собственно вот исходник:
#-*- coding: UTF-8 -*- #Импортируем модуль random, для генерации псевдослучайных целых чисел import random #объявляем пустой массив rawArray = [] #заполняем пустой массив случайными значениями от -100 до 100 for i in range(random.randint(1, 100)): rawArray.append(random.randint(-100, 100)) #функция для нахождения среднего арифметического максимального и минимального элементов def midEl(y = []): #переменные для хранения максимального и минимального элементов maxEl = y[0] minEl = y[0] #Находим максимальный и минимальный элемент в массиве rawArray for j in range(0, len(y) - 1): if y[j] >= maxEl: maxEl = y[j] elif y[j] <= minEl: minEl = y[j] #находим среднее арифметическое значение макс и мин элементов, и возращаем значение return (maxEl+minEl)/2 #объявлеяем функцию сортировки def qSort(x = []): #иттератор с начала массива i = 0 #иттератор с конца массива r = len(x) - 1 #опорный элемент midElem = midEl(x) #два массива для хранения промежуточных результатов first = [] second = [] #перебираем весь массив for j in range(0, r): #если иттераторы равны, значит мы дошли до середины! while i != r: #если элемент меньше среднеарифметической, то он попадает в первую часть массива, если нет, то в конец if x[j] <= midElem: rawArray[i] = x[j] first.append(x[j]) i += 1 elif x[j] >= midElem: rawArray[r] = x[j] second.append(x[j]) r -= 1 #рекурсивно вызываем функцию сортировки if len(first) > 1 and len(second) > 1: qSort(first) qSort(second) elif len(first) > 1: qSort(second) elif len(second) > 1: qSort(second) qSort(rawArray) print(rawArray)
Traceback (most recent call last):
File "qs.py", line 65, in <module>
qSort(rawArray)
File "qs.py", line 60, in qSort
qSort(second)
File "qs.py", line 35, in qSort
midElem = midEl(x)
File "qs.py", line 14, in midEl
maxEl = y[0]
IndexError: list index out of range
Отредактировано nicktone (Июль 5, 2015 01:47:52)
Прикреплённый файлы: qs.py (2,6 KБ)
Офлайн
У пустого списка нет нулевого элемента. Рано или поздно first и second становятся пустыми и подаются снова в qSort().
Вообще, должна быть функция, которая принимает массив и возвращает отсортированный массив тот же самый или новый. А тут происходит изменение глобального массива.
Офлайн
py.user.nextСпасибо! Буду двигаться в этом направлении!
У пустого списка нет нулевого элемента. Рано или поздно first и second становятся пустыми и подаются снова в qSort().Вообще, должна быть функция, которая принимает массив и возвращает отсортированный массив тот же самый или новый. А тут происходит изменение глобального массива.
#рекурсивно вызываем функцию сортировки if len(first) > 1 and len(second) > 1: qSort(first) qSort(second) elif len(first) > 1: qSort(second) elif len(second) > 1: qSort(second)
Офлайн
nicktoneТам у тебя ошибка в первом elif'е.
Я убежден, что блок: “if:.. elif:.. elif:..” - не даст выполнить функцию для пустого списка(массива).
Офлайн