Уведомления

Группа в Telegram: @pythonsu

#1 Июль 4, 2015 20:58:35

nicktone
Зарегистрирован: 2015-07-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с алгоритмом QuickSort

Собственно вот исходник:

#-*- 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)                   

Пытаюсь написать быструю сортировку. При компиляции Python 3.4 выдаёт ошибку:
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)

Прикреплённый файлы:
attachment qs.py (2,6 KБ)

Офлайн

#2 Июль 5, 2015 00:45:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите с алгоритмом QuickSort

У пустого списка нет нулевого элемента. Рано или поздно first и second становятся пустыми и подаются снова в qSort().

Вообще, должна быть функция, которая принимает массив и возвращает отсортированный массив тот же самый или новый. А тут происходит изменение глобального массива.



Офлайн

#3 Июль 5, 2015 01:46:57

nicktone
Зарегистрирован: 2015-07-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с алгоритмом QuickSort

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)

Я убежден, что блок: “if:.. elif:.. elif:..” - не даст выполнить функцию для пустого списка(массива).
Я вызываю функцию qSort на массивы(списки) first и second, только в том случае, если размер которых превышает хотя бы один элемент(т.е. список не пустой). Или я в чем то ошибаюсь?

P.S. Я уже однажды писал QuickSort на Java, но действовал я по инструкциям от Р. Седжвика, а в связи с желанием освоить Python, решил попробовать самостоятельно вспомнить написать данный алгоритм.

Офлайн

#4 Июль 5, 2015 03:13:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите с алгоритмом QuickSort

nicktone
Я убежден, что блок: “if:.. elif:.. elif:..” - не даст выполнить функцию для пустого списка(массива).
Там у тебя ошибка в первом elif'е.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version