Алгоритмы сортировки
Сортировка пузырьком (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