sort: alloc/sort.nepl に関する機能を提供するライブラリ
- このモジュールの公開 API を提供します。
- 実装の変更時に最小限の doctest 実行経路を維持します。
- 利用時は各関数の「目的」「注意」「計算量」を確認してください。
#entry main
#target std
#import "std/test" as *
#import "alloc/collections/vec/sort" as *
#import "alloc/collections/vec" as *
#import "core/math" as *
fn mk <()*>Vec<i32>> ():
let v0 vec_new<i32>;
let v1 vec_push<i32> v0 3;
let v2 vec_push<i32> v1 1;
vec_push<i32> v2 2
fn sorted3 <()*>Vec<i32>> ():
let v0 vec_new<i32>;
let v1 vec_push<i32> v0 1;
let v2 vec_push<i32> v1 2;
vec_push<i32> v2 3
fn main <()*>()> ():
sort_quick<i32> mk;
assert sort_is_sorted<i32> sorted3;#entry main
#target std
#import "std/test" as *
#import "alloc/collections/vec/sort" as *
#import "alloc/collections/vec" as *
#import "core/math" as *
fn main <()*>()> ():
let u0 vec_new<i32>;
let u1 vec_push<i32> u0 4;
let u2 vec_push<i32> u1 3;
let u3 vec_push<i32> u2 2;
let u4 vec_push<i32> u3 1;
sort_merge<i32> u4;
assert true;sort_lt: 主な用途
- sort_lt の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_le: 主な用途
- sort_le の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_gt: 主な用途
- sort_gt の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_ge: 主な用途
- sort_ge の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_get_unchecked: 主な用途
- sort_get_unchecked の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_set_unchecked: 主な用途
- sort_set_unchecked の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_swap: 主な用途
- sort_swap の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_is_sorted: 主な用途
- sort_is_sorted の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_insertion: 主な用途
- sort_insertion の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_selection: 主な用途
- sort_selection の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_bubble: 主な用途
- sort_bubble の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_cocktail: 主な用途
- sort_cocktail の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_gnome: 主な用途
- sort_gnome の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_shell: 主な用途
- sort_shell の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_comb: 主な用途
- sort_comb の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_quick_partition: 主な用途
- sort_quick_partition の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_quick_range: 主な用途
- sort_quick_range の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_quick: 主な用途
- sort_quick の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_heap_sift_down: 主な用途
- sort_heap_sift_down の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_heap: 主な用途
- sort_heap の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。
sort_buf_get
merge sort
目的
sort_merge_range_dataが一時 buffer に退避 した要素 を、MemPtr<.T>基準 で取 り出 せるようにします。
実装
idx * size_of<.T>で byte offset を計算 し、buffer先頭 からload<.T>します。
注意
bufは.Tの配列 として有効 である必要 があります。idxの境界 確認 は呼 び出 し側 が担当 します。
計算量
- O(1)
sort_buf_set
merge sort
目的
一時 buffer に現在 の要素 列 を複写 し、merge中 に安定 した読 み取 り元 を確保 します。
実装
idx * size_of<.T>を求 め、buffer先頭 からstore<.T>します。
注意
bufは.Tの配列 として有効 である必要 があります。valはstore<.T>によって buffer へ書 き込 まれます。
計算量
- O(1)
sort_merge_range_data
merge sort の 1
目的
data_ptrが指 す[l, r)区間 を merge sort で整列 します。比較元 を壊 さないため、bufに現在 の内容 を退避 してから統合 します。
実装
中央 midで 2分割 し、左右 を再帰的 に sort したあと、bufに複写 した要素 を 2本 の読 み取 り位置 で merge します。
注意
data_ptrとbufは.Tをr個分 まで安全 に読 み書 きできる領域 である必要 があります。境界 確認 は内部 で省略 しているため、l <= rと十分 な容量 は呼 び出 し側 の責任 です。
計算量
時間 計算量 は O(n log n)、追加 空間 計算量 は O(n) です。
sort_merge
Vec<.T> を merge sort で
目的
安定 な O(n log n) sort としてVec<.T>を昇順 へ並 べ替 えます。
使用例
#entry main
#target std
#import "std/test" as *
#import "alloc/collections/vec" as *
#import "alloc/collections/vec/sort" as *
#import "core/result" as *
fn main <()*>i32> ():
let v <Vec<i32>>:
new<i32>
|> push 3
|> push 1
|> push 2
sort_merge<i32> v;
0実装
Vecのdataを raw address へ下 ろし、.T配列 1本分 の作業 buffer をalloc_ptr<.T>で確保 してsort_merge_range_dataを呼 びます。
注意
作業 buffer確保 に失敗 した場合 はunwrap_okにより到達不能 になります。現状はsort_mergeがResultを返 さないためです。- ソートは in-place なので
vの並 び順 は関数 呼 び出 し後 に変更 されます。
計算量
時間 計算量 は O(n log n)、追加 空間 計算量 は O(n) です。
sort_slice_quick: 生ポインタ配列を quick sort で並べ替える
data_ptrから始まる長さlenの連続領域を in-place で昇順ソートします。
sort_quick_range_dataを直接呼び出す薄いラッパです。
data_ptrは.Tのlen要素ぶん有効である必要があります。- メモリ所有権・境界チェックは呼び出し側が管理します。
- 平均 O(n log n), 最悪 O(n^2)
sort_i32: i32 配列ポインタを in-place で昇順ソートする
- 競技プログラミング向けに
sort_i32(ptr, n)の薄い API を提供します。
sort_slice_quick<i32>を呼び出します。
data_ptrはn個のi32が格納された有効な領域である必要があります。
- 平均 O(n log n), 最悪 O(n^2)
sort_quick_ret: quick sort 後の Vec を返す
- 破壊的ソートを行った同じ
Vecを返し、後続処理で検証や連結処理をしやすくします。
sort_quickを呼んだあとvをそのまま返します。
- ソート自体は in-place です。
sort_quickと同じです。
sort_heap_ret: heap sort 後の Vec を返す
- 破壊的ソートを行った同じ
Vecを返し、後続処理で検証や連結処理をしやすくします。
sort_heapを呼んだあとvをそのまま返します。
- ソート自体は in-place です。
sort_heapと同じです。
sort_merge_ret: merge sort 後の Vec を返す
- 破壊的ソートを行った同じ
Vecを返し、後続処理で検証や連結処理をしやすくします。
sort_mergeを呼んだあとvをそのまま返します。
- ソート自体は in-place です。
sort_mergeと同じです。
sort: 主な用途
- sort の主な用途と呼び出し方を示します。
- 定義済み処理をそのまま呼び出す薄いラッパで構成されています。
- 引数の値は関数呼び出しで移動するため、再利用時は束縛し直してください。
- 本体処理に準じます。