Advertisement
C3EQUALZ

Все виды сортировок.

Nov 24th, 2022 (edited)
697
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.13 KB | None | 0 0
  1. ###Сортировка пузырьком. Идем последовательно, сравнивая каждый элемент с соседом. Кол-во итераций здесь n - 1 (просто запомнить этот факт). Делаю n - i - 1, так как на 1 число каждый раз меньше рассматривать, после 1 итерации выйдет max в конец. flag сделал для более высокой скорости кода, если будет уже все отсортировано меньше, чем за n-1.  
  2. def bubble_sort(lst):
  3.     n = len(lst)
  4.     for i in range(n - 1):
  5.         flag = True
  6.         for j in range(n - i - 1):
  7.             if lst[j] > lst[j + 1]:
  8.                 lst[j], lst[j + 1] = lst[j + 1], lst[j]
  9.                 flag = False
  10.         if flag == True:
  11.             break
  12.     return lst
  13.  
  14. ###Сортировка выбором. Находим минимальное значение в списке, достаем индекс, удаляем его (pop() возвращает значение), а потом добавляем в конец списка. С помощью среза перестаю рассматривать последний элемент и т.д.
  15. def selection_sort(lst):
  16.     for k in range(len(lst), 0, -1):
  17.         lst.append(lst.pop(lst.index(min(lst[:k]))))
  18.     return lst
  19.  
  20.  
  21. def selection_sort_ver2(lst: list[int]) -> list[int]:
  22.     """
  23.    Сортировка списка методом выбора
  24.    :param lst: список, состоящий из чисел
  25.    :return: отсортированный список
  26.    """
  27.     for min_pos in range(len(lst) - 1):
  28.         for k in range(min_pos + 1, len(lst)):
  29.             if lst[k] < lst[min_pos]:
  30.                 lst[k], lst[min_pos] = lst[min_pos], lst[k]
  31.     return lst
  32.  
  33.  
  34. ###Сортировка вставкой. Здесь мы берем элемент и сравниваем с прошлыми до самого начала. Самый минимальный сразу станет в начало. Идем последовательно слева-направо.
  35. def s_insert(lst):
  36.     for i in range(1, len(lst)):
  37.         for j in range(i,0,-1):
  38.             if lst[j] < lst[j-1]:
  39.                 lst[j], lst[j-1] = lst[j-1], lst[j]
  40.             else:
  41.                 break
  42.     return lst
  43.  
  44. ### Сортировка Шелла. Здесь мы берем и сравниваем элементы на расстоянии, начиная с n//2 и уменьшая данное расстояние в два раза.
  45. def shell_sort(lst):
  46.     move = len(lst) // 2
  47.     while move > 0:
  48.         for i in range(len(lst) - move):
  49.             if lst[i] > lst[i+move]:
  50.                 lst[i], lst[i+move] = lst[i+move], lst[i]
  51.         move //= 2
  52.     return lst
  53.  
  54. ### Сортировка Хоара. Здесь мы берем случайный элемент из списка и формируем два списка, ставя вокруг данного элемента. Способ рекурсивный.
  55. def quick_sort(lst):
  56.     if len(lst) > 1:
  57.         x = matrix[random.randint(0, len(lst)-1)]
  58.         low = [l for l in matrix if l < x]
  59.         eq = [l for l in matrix if l == x]
  60.         high = [l for l in matrix if l > x]
  61.         lst = quick_sort(low) + eq + quick_sort(high)
  62.     return lst
  63.  
  64. ### Сортировка слиянием. Делим исходный наш лист постоянно на две части, пока каждый элемент не будет по отдельности. Объединяем листы, а потом сортируем с помощью сортировки выбора (def merge_list).
  65.  
  66. def merge_sort(lst : list) -> list:
  67.     def merge_list(a, b):
  68.         sum_list, c = a + b, []
  69.         while sum_list:
  70.             c.append(sum_list.pop(sum_list.index(min(sum_list))))
  71.         return c
  72.     def split_and_merge_list(lst):
  73.         a, b = lst[len(lst) // 2:], lst[:len(lst) // 2]
  74.         if len(a) > 1:
  75.             a = split_and_merge_list(a)
  76.         if len(b) > 1:
  77.             b = split_and_merge_list(b)
  78.         return merge_list(a, b)
  79.     return split_and_merge_list(lst)
  80.  
  81. ###Сортировка кучей с помощью модуля heapq.
  82. def heap_sort(list_for_sort: list) -> list:
  83.     heapq.heapify(list_for_sort)
  84.     return [heapq.heappop(list_for_sort) for i in range(len(list_for_sort))]
  85.  
  86. ###Сортировка кучей без модуля. Все действия описаны в процессе кода.
  87.  
  88. def heap_sort(numbers):
  89.     ### n - кол-во элементов
  90.     def heapify(numbers : list, indexs : int, n : int) -> list:
  91.         l_child, r_child = 2*indexs + 1, 2*indexs + 2 #дочерние элементы
  92.         root_element = indexs #препдполагаем, что наш корневой элемент максимальный
  93.  
  94.         #проверяем, что мы не вылетели из списка по длине, поиск старшего элемента, max() неправильно
  95.         if l_child <= n and numbers[l_child] > numbers[root_element]:
  96.             root_element = l_child
  97.  
  98.         if r_child <= n and numbers[r_child] > numbers[root_element]:
  99.             root_element = r_child
  100.         #Если элемент не поменялся, то прекращаем работу функции
  101.         if root_element == indexs:
  102.             return numbers
  103.         else:
  104.             numbers[root_element], numbers[indexs] = numbers[indexs], numbers[root_element]
  105.             #Продолжаем проверять для каждого старшего элемента
  106.             heapify(numbers, root_element, n)
  107.  
  108.     def build_max_heap(numbers : list) -> list:
  109.         #Алгоритм сам по себе работает с центра, то есть это первые действие в нашей сортировке.
  110.         #Вызываем от центрального и ссылаемся на прошлую функцию с действиями.
  111.         index_middle = len(numbers) // 2
  112.         for idx in range(index_middle, -1, -1):
  113.             heapify(numbers, idx, len(numbers) - 1)
  114.  
  115.     def last_sort(numbers: list) -> list:
  116.         #Восстанваливаем св-ва пирамиды со старта
  117.         build_max_heap(numbers)
  118.         for idx in range(len(numbers) - 1, -1, -1):
  119.             numbers[0], numbers[idx] = numbers[idx], numbers[0]
  120.             heapify(numbers, 0, idx - 1)
  121.            
  122.         return numbers
  123.  
  124.     return last_sort(numbers)
  125.  
  126. ### Сортировка по столбцам матрицы. Если нужно сортировать столбец матрицы, то можно использовать numpy. m - количество столбцов матрицы, mas - вложенный двумерный список.  
  127. import numpy as np
  128.  
  129. def colum_matrix_sort(mas):
  130.     mas = np.array(mas)
  131.     m = len(mas[1:,])
  132.     for k in range(m):
  133.         mas[:, k] = sorted(mas[:, k])
  134.         return np.around(mas, decimals=3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement