Code Monkey home page Code Monkey logo

algorithms's Introduction

MergeSort Сортировка слиянием

В качестве рекурсивного алгоритма "разделяй и властвуй" алгоритм MergeSort оперирует более мелкими массивами. Самый простой способ разложить задачу сортировки на более мелкие - разбить входной массив пополам. Первая и вторая половины сортируются рекурсивно.

Вход: массив(список) A из n разных целых чисел.

Выход: массив(список) с теми же самыми целыми числами, отсортированными от наименьшего к наибольшему.

С - left_partition - рекурсивно отсортировать первую половину A.

D - right_partition - рекурсивно отсортировать вторую половину А. Вернуть Merge(C, D).

  1. Сохраняем длину исходного списка в переменной list-length.
def merge_sort(list):
    list_length = len(list)
  1. Функция merge_sort возвращает отсортированный список. Список длиной в единицу технически отсортирован; следовательно, список возвращается.

    if list_length == 1:
        return list
  2. Для любого списка длиной больше 1 следующим шагом является разделение списка на left_partition и right_partition. Это достигается путем передачи средней точки исходного списка в функцию merge_sort.

    mid_point = list_length // 2
  3. Алгоритмы "разделяй и властвуй" рекурсивны. В реализации алгоритма сортировки слиянием рекурсия происходит при разбивке списков. Чтобы убедиться, что все разделы разбиты на их отдельные компоненты, вызывается функция merge_sort, и в качестве параметра передается разделенная часть списка.

    left_partition = merge_sort(list[:mid_point])
    right_partition = merge_sort(list[mid_point:])
  4. Функция merge_sort возвращает список, состоящий из отсортированных левого и правого разделов.

    return merge(left_partition, right_partition)

Вторая часть алгоритма сортировки слиянием связана с фактической сортировкой элементов в списке в указанном порядке. В этом случае порядок сортировки элементов в исходном списке возрастающий.

Вход: отсортированные массивы С и D.

Выход: отсортированный массив B.

i = 0

j = 0

for k = 1 to n do

if C[i] < D[j] then
    
    B[k] = C[i]           #заполнить выходной массив
    
    i = i + 1             #прирастить i

else
    
    B[k] = D[j]
    
    j = j + 1
  1. Функция слияния принимает в себя два списка и возвращает отсортированный список, состоящий из элементов в двух списках, переданных в качестве параметров функции слияния.
def merge(left, right):
  1. Инициализируется пустой список с именем output. Этот список заполняется отсортированными элементами. Кроме того, инициализируются две переменные i и j, которые используются в качестве указателей при переборе списков.
    output = []
    i = j = 0
  1. Мы выполняем итерацию обоих списков с помощью цикла while, который выполняется при условии, что оба индекса i и j меньше длины левого и правого списков соответственно.
    while i < len(left) and j < len(right):
  1. В теле цикла while сравниваем элементы в каждой позиции обоих списков во время каждой итерации. Искомый список заполняется меньшим значением по текущему индексу списка, в котором находится соответствующий указатель.
         if left[i] < right[j]:
            output.append(left[i])
  1. После заполнения output списка необходимо увеличить соответствующий указатель. По сути, мы перемещаем указатель вправо или на следующее значение в списке.
            i += 1
        else:
            output.append(right[j])
            j += 1
  1. После завершения цикла while или если условие всего цикла не выполняется, output список заполняется содержимым остатков каждого списка. Оставшиеся элементы выбираются из текущего значения указателя в конец соответствующего списка.
    output.extend(left[i:])
    output.extend(right[j:])

    return output
    
def run_merge_sort():
    unsorted_list = [4, 1, 5, 7, 2, 6, 1, 1, 6, 4, 10, 33, 5, 7, 23]
    print(unsorted_list)
    sorted_list = merge_sort(unsorted_list)
    print(sorted_list)


run_merge_sort()

Сортировка слиянием, по сравнению с другими алгоритмами сортировки, обычно выполняется быстрее на больших наборах данных. Это связано с тем, что сортировка слиянием занимает меньшее количество шагов для сортировки списка. Большинство других алгоритмов сортировки, таких как InsertionSort и BubbleSort , должны выполнять много шагов для сортировки списка. Например, сортировка списка, содержащего 40 элементов, займет 1600 шагов (40*40) с использованием алгоритма сортировки вставкой, но при сортировке слиянием для сортировки списка потребуется примерно 64 шага.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.