Алгоритмы сортировки

📂 Алгоритмы

Сортировка пузырьком (bubble sort)

Время: О(n**2)

Используем вложенные циклы, внешний проходит по всему массиву (i), вложенный по его неотсортированной части (j). При обнаружении j-элемента меньшего, чем i-элемент, меняем значения местами. Таким образом, список будет отсортирован по возрастанию. Чтобы отсортировать по убыванию, поменять сравнение на >.

def sort_list(source_list: list) -> list:
    sorted_list = source_list[:]
 
    for i in range(len(sorted_list)):
        for j in range(i + 1, len(sorted_list)):
            if sorted_list[j] < sorted_list[i]:
                sorted_list[j], sorted_list[i] = sorted_list[i], sorted_list[j]
 
    return sorted_list
 
 
my_list = [9, 8, 7, 6, 5, 4, 3, 2, 1]
 
print(sort_list(source_list=my_list))

Сортировка выбором

Время: О(n**2)

Находим максимальный элемент, перемещаем его в новый массив. Повторяем операцию среди оставшихся элементов, пока они не закончатся.

def find_index_of_smallest(array: list) -> int:
    smallest = array[0]
    smallest_index = 0
 
    for i in range(1, len(array)):
        if array[i] < smallest:
            smallest = array[i]
            smallest_index = i
 
    return smallest_index
 
 
def sort_list(source_list: list) -> list:
    sorted_array = []
    for i in range(len(source_list)):
        smallest_index = find_index_of_smallest(source_list)
        # Remove item from source_list, appending it to sorted array.
        sorted_array.append(source_list.pop(smallest_index))
    return sorted_array
 
 
my_list = [9, 8, 7, 6, 5, 4, 3, 2, 1]
 
print(sort_list(source_list=my_list))

Быстрая сортировка

Время: O(n * logn)

Грокаем, стр. 85.

Является рекурсивным алгоритмом. Базовый случай – пустой массив, массив с одним элементом.

Используется стратегия “разделяй и властвуй”. Следовательно, массив должен разделяться до тех пор, пока мы не придём к базовому случаю.

Сначала в массиве выбирается элемент, который называется опорным. Это будет первый элемент массива (рекомендуется выбирать случайный элемент).

Затем находится элементы меньшие опорного, и большие опорного. Этот процесс называется разделением.

def quicksort(source_list: list) -> list:
    # Base case
    if len(source_list) < 2:
        return source_list
    # Recursive step
    else:
        pivot = source_list[0]
        less = [i for i in source_list[1:] if i <= pivot]
        greater = [i for i in source_list[1:] if i > pivot]
 
        return quicksort(less) + [pivot] + quicksort(greater)
 
 
my_list = [9, 8, 7, 6, 5, 4, 3, 2, 1]
 
print(quicksort(source_list=my_list))
// https://www.codewars.com/kata/5174a4c0f2769dd8b1000003/train/go
package kata
 
func SortNumbers(numbers []int) []int {
  if numbers == nil {
    return []int{}  
  }
  
  if len(numbers) < 2 {
    return numbers
  }
  
  pivot := numbers[0]
  var less []int
  for _, i := range numbers[1:] {
    if i <= pivot {
      less = append(less, i)
    }
  }
  
  var more []int
  for _, i := range numbers[1:] {
    if i > pivot {
      more = append(more, i)
    }
  }
  
  return append(append(SortNumbers(less), pivot), SortNumbers(more)...)
}
export function solution(nums: number[]): number[] {
  if (!nums.length) return []
  
  if (nums.length < 2) return nums;
  
  const pivot = nums[0];
  const less: number[] = [];
  const more: number[] = [];
  nums.slice(1).map((i) => {
    if (i <= pivot) less.push(i);
    else if (i > pivot) more.push(i);
  });
  
  return [...solution(less), pivot, ...solution(more)]
}

Ссылки


📂 Алгоритмы | Последнее изменение: 07.02.2024 20:18