merge_sort¶
ソースコード¶
from titan_pylib.algorithm.sort.merge_sort import merge_sort
展開済みコード¶
1# from titan_pylib.algorithm.sort.merge_sort import merge_sort
2# from titan_pylib.my_class.supports_less_than import SupportsLessThan
3from typing import Protocol
4
5
6class SupportsLessThan(Protocol):
7
8 def __lt__(self, other) -> bool: ...
9from typing import Iterable, TypeVar, Callable
10
11T = TypeVar("T", bound=SupportsLessThan)
12
13
14def merge_sort(
15 a: Iterable[T], key: Callable[[T, T], bool] = lambda s, t: s < t
16) -> list[T]:
17 """マージソートです。安定なはずです。
18 最悪 :math:`O(n\\log{n})` 時間です。
19
20 Args:
21 a (Iterable[T]): ソートする列です。
22 key (Callable[[T, T], bool], optional): 比較関数 `key` にしたがって比較演算をします。
23 (第1引数)<=(第2引数) のとき、 ``True`` を返すようにしてください。
24 """
25
26 def _sort(l: int, r: int) -> None:
27 if r - l <= 1:
28 return
29 if r - l == 2:
30 if not key(a[l], a[l + 1]):
31 a[l], a[l + 1] = a[l + 1], a[l]
32 return
33 mid = (l + r) // 2
34 _sort(l, mid)
35 _sort(mid, r)
36 i, j = l, mid
37 indx = 0
38 while i < mid and j < r:
39 if key(a[i], a[j]):
40 buff[indx] = a[i]
41 i += 1
42 else:
43 buff[indx] = a[j]
44 j += 1
45 indx += 1
46 for k in range(i, mid):
47 a[l + indx + k - i] = a[k]
48 for k in range(l, l + indx):
49 a[k] = buff[k - l]
50
51 a = list(a)
52 buff = [0] * len(a)
53 _sort(0, len(a))
54 return a
仕様¶
- merge_sort(a: ~typing.Iterable[~titan_pylib.algorithm.sort.merge_sort.T], key: ~typing.Callable[[~titan_pylib.algorithm.sort.merge_sort.T, ~titan_pylib.algorithm.sort.merge_sort.T], bool] = <function <lambda>>) list[T] [source]¶
マージソートです。安定なはずです。 最悪 \(O(n\log{n})\) 時間です。
- Parameters:
a (Iterable[T]) – ソートする列です。
key (Callable[[T, T], bool], optional) – 比較関数 key にしたがって比較演算をします。 (第1引数)<=(第2引数) のとき、
True
を返すようにしてください。