Задать вопрос
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Кому интересно окончательная версия того ответа (в некоторой реализации алгоритма так сказать что я хотел услышать от многоуважаемых партнеров Хабра)

    from random import randint
    
    
    def hoare_partition(in_arr, l_index, r_index):
        pivot = in_arr[randint(l_index, r_index)]
        r_pointer = r_index
        l_pointer = l_index
        while l_pointer <= r_pointer:
            while in_arr[l_pointer] < pivot:
                l_pointer += 1
            while in_arr[r_pointer] > pivot:
                r_pointer -= 1
            if l_pointer >= r_pointer:
                break
            in_arr[l_pointer], in_arr[r_pointer] = in_arr[r_pointer], in_arr[l_pointer]
            r_pointer -= 1
            l_pointer += 1
    
        l_pointer = 0
        r_pointer_1 = r_pointer
        while l_pointer <= r_pointer_1:
            while in_arr[l_pointer] < pivot:
                l_pointer += 1
            while in_arr[r_pointer_1] == pivot:
                r_pointer_1 -= 1
            if l_pointer >= r_pointer_1:
                break
            in_arr[l_pointer], in_arr[r_pointer_1] = in_arr[r_pointer_1], in_arr[l_pointer]
            r_pointer_1 -= 1
            l_pointer += 1
    
        l_pointer = r_pointer + 1
        r_pointer = len(in_arr) - 1
    
        while l_pointer < r_pointer:
            while in_arr[l_pointer] == pivot:
                if l_pointer + 1 == len(in_arr):
                    break
                l_pointer += 1
            while in_arr[r_pointer] > pivot:
                r_pointer -= 1
            if l_pointer >= r_pointer:
                break
            in_arr[l_pointer], in_arr[r_pointer] = in_arr[r_pointer], in_arr[l_pointer]
            r_pointer -= 1
            l_pointer += 1
        i_1 = 0
        while in_arr[i_1] < pivot:
            i_1 = i_1 + 1
        i_2 = 0
        while (i_1 + i_2) < len(in_arr) and in_arr[i_1 + i_2] == pivot:
            i_2 = i_2 + 1
        return i_1, i_2
    
    
    def hoare_sort(in_arr, l_index, r_index):
        if l_index >= r_index:
            return in_arr
        i_1, i_2 = hoare_partition(in_arr, l_index, r_index)
        hoare_sort(in_arr, l_index, i_1)
        hoare_sort(in_arr, (i_1 + i_2), r_index)
    
    
    def main():
        for j in range(0, 1000):
            print("N:", j)
            a = [randint(0, 10) for i in range(0, 10)]
            print(a)
            hoare_sort(a, 0, len(a)-1)
            print(a)
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Вообще пока "игрался" в пайчарме придумал вот такой костыль код (который делает именно разбиение на меньше пивота, больше пивота и равный пивоту)

    from random import randint
    
    
    def hoare_partition(in_arr, l_index, r_index):
        pivot = in_arr[(l_index+r_index)//2]
        r_pointer = r_index
        l_pointer = l_index
        while l_pointer <= r_pointer:
            while in_arr[l_pointer] < pivot:
                l_pointer += 1
            while in_arr[r_pointer] > pivot:
                r_pointer -= 1
            if l_pointer >= r_pointer:
                break
            in_arr[l_pointer], in_arr[r_pointer] = in_arr[r_pointer], in_arr[l_pointer]
            r_pointer -= 1
            l_pointer += 1
    
        l_pointer = 0
        r_pointer_1 = r_pointer
        while l_pointer <= r_pointer_1:
            while in_arr[l_pointer] < pivot:
                l_pointer += 1
            while in_arr[r_pointer_1] == pivot:
                r_pointer_1 -= 1
            if l_pointer >= r_pointer_1:
                break
            in_arr[l_pointer], in_arr[r_pointer_1] = in_arr[r_pointer_1], in_arr[l_pointer]
            r_pointer_1 -= 1
            l_pointer += 1
    
        l_pointer = r_pointer + 1
        r_pointer = len(in_arr) - 1
    
        while l_pointer < r_pointer:
            while in_arr[l_pointer] == pivot:
                if l_pointer + 1 == len(in_arr):
                    return in_arr
                l_pointer += 1
            while in_arr[r_pointer] > pivot:
                r_pointer -= 1
            if l_pointer >= r_pointer:
                break
            in_arr[l_pointer], in_arr[r_pointer] = in_arr[r_pointer], in_arr[l_pointer]
            r_pointer -= 1
            l_pointer += 1
        print(pivot)
        return in_arr
    
    
    for j in range(0, 1000):
        print("N:", j)
        a = [randint(0, 10) for i in range(0, 10)]
        print(a)
        print(hoare_partition(a, 0, len(a) - 1))


    Причем данный partition работает и на рандоме (недетерминированый partition) и на определенном выборе pivota. Теперь с этим костылем можно сделать быструю сортировку так как она была изначально задумана (имхо) in_place. Спасибо всем за помощь еще раз.
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Спасибо. Я так и думал
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    alexalexes, Проще тут вообще вопросы не задавать если каждый вопрос необходимо расщеплять до атомов может вам еще байт код привести, или вообще проанализировать зацикливание алгоритма на уровне перестановки битов? (ИРОНИЯ если что сказал же тема закрыта я все понял спасибо за ваше участие, насчет того что я неправильно сформулировал вопрос (ибо его не поняли другие) то уж извините недавно на форуме сижу и не совсем пока ознакомился с правилами постановки вопроса(уже писал выше) ).
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    А через randint нельзя pivot выбирать? Обязательно по середине? Вообще если оптимум делать то пивот нужно брать медианной.
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    VoidVolker, Спасибо вопрос закрыт. Проще самому было разобраться и выдумать этот алгоритм чем что то спрашивать. Извиняюсь за неудобства недавно тут на форуме сижу. Шутка про то что только 1 процент программистов умеет нормально писать алгоритм сортировки Хоара видимо оказалась не совсем шуткой.
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    VoidVolker, Вы пробовали прогнать функцию написаную выше на массиве о котором я написал выше. Ну вот если нет он зацикливается я этот алгоритм который написан выше увидел при просмотре лекции по алгоритмам и структурам данных и он не работает на всех данных. И я хочу узнать как его правильно реализовать или по крайней мере где тут ошибка. Что тут непонятного?
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    VoidVolker, Можно вопрос (в качестве шутки) если я напишу код своей рукой на бумажке A4 и отправлю его в качестве изображения это будет считается нарушением правил? Например у меня нету доступа к ПК
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Добрый вечер.
    def hoare_partition(arr, low, high):
        pivot = arr[low]
        i = low 
        j = high 
    
        while True:
            i += 1
            while arr[i] < pivot:
                i += 1
    
            j -= 1
            while arr[j] > pivot:
                j -= 1
    
            if i >= j:
                return j
    
            arr[i], arr[j] = arr[j], arr[i]


    Метод partition (он начинает зацыкливать сортировку на определенных массивах). Например [37, 100, 26, 69, 91, 78, 7, 61, 46, 11, 37]. Код не мой если что взято из интернета. Про процедуру саму partition вообще конкретно нигде не написано (толком нормальных источников нету хотя эта процедура используется например в нахождении k_той статистики). Варианты типо ограничить память на стеке вызовов не предлагать
    Написано
  • Как правильно написать partition?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Может быть я просто не понимаю как вообще после partition должен выглядить массив. Например у Вирта в его книжке данный массив разбивается на массивы в которой один из массивов "не упорядочен" относительно pivota 67ed986495093850335789.png

    Т.е. бог знает как там располагаться элементы должны относительно pivota. И то забавно что в этом разбиении в разных подмассивах (1 и 3 могут быть пивоты) а в этом смысле это не разбиение
    Написано
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Можно сделать так?Ошибке поставить в соответствие некоторый класс(создаваемый интерпретатором питона при ошибке) кроме фатальной.И назвать это исключением всмысле того как это понимаеться в питоне.А что тогда делать с фатальными ошибками)?
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Интересно заменить что ваша классификация идёт от низкоуровнего до высокоуровнего(есть некоторые предпосылки этого).Ну так исключения это что просто способ обработки ошибочных ситуаций на высоком уровне или как?Чёт тогда вообще получается странно в питоне это класс.В вашей трактовке это просто способ.
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    mayton2019, Семантических уровня ошибок или чего?
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Чёт странно получаеться(Только сейчас заметил).Суть исключения это класс а не действие или не так?
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Короче резюме:
    1.Вопрос не совсем тривиален 5 ответов на один вопрос
    2.Я так понял что в разных Я.П эти понятия по разному понимаються
    3.В документации написано что ошибки (во время выполнения обнаруженные) называются исключениями являются не фатальными.(Обратное верно?).Хотя вообще тут класс как бы создаётся при ошибках.
  • Чем ошибки отличаться от исключений?

    Hazlarorn
    @Hazlarorn Автор вопроса
    К чему вопрос задан просто как я понимаю в Яве ошибки и исключения это суть объекты разных классов.А в питоне при возникновении ошибки любой я так понял объект класса исключения создаётся.Если более корректно то класс исключения в питоне создаётся при любой ошибке?
  • Чем отличаются структуры данных от колекции?

    Hazlarorn
    @Hazlarorn Автор вопроса
    Т.е не каждая структура данных это коллекция но каждая коллекция это структура данных?