# ============================================
# ソートアルゴリズムのサンプルコード
# ============================================
# ============================================
# 1. バブルソート(Bubble Sort)
# ============================================
# 最もシンプルで理解しやすいソートアルゴリズム
# 時間計算量: O(n²)
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
for (i ← 1 to N - 1)
for (j ← 1 to N - i)
if (A[j] > A[j + 1])
TEMP ← A[j]
A[j] ← A[j + 1]
A[j + 1] ← TEMP
endif
endfor
endfor
for (k ← 1 to N)
print A[k]
endfor
# ============================================
# 2. 選択ソート(Selection Sort)
# ============================================
# 最小値を見つけて先頭に移動する
# 時間計算量: O(n²)
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
for (i ← 1 to N - 1)
MIN_POS ← i
for (j ← i + 1 to N)
if (A[j] < A[MIN_POS])
MIN_POS ← j
endif
endfor
if (MIN_POS != i)
TEMP ← A[i]
A[i] ← A[MIN_POS]
A[MIN_POS] ← TEMP
endif
endfor
for (k ← 1 to N)
print A[k]
endfor
# ============================================
# 3. 挿入ソート(Insertion Sort)
# ============================================
# カードを並べ替えるように、要素を適切な位置に挿入
# 時間計算量: O(n²) だが、実用的には高速
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
for (i ← 2 to N)
KEY ← A[i]
j ← i - 1
while (j >= 1 AND A[j] > KEY)
A[j + 1] ← A[j]
j ← j - 1
endwhile
A[j + 1] ← KEY
endfor
for (k ← 1 to N)
print A[k]
endfor
# ============================================
# 4. クイックソート(Quick Sort)- Lomuto方式
# ============================================
# 分割統治法を使った高速なソート
# 時間計算量: 平均 O(n log n)、最悪 O(n²)
# 注意: このアプリでは動作しますが、無限ループの可能性があるため注意が必要です
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
call QuickSort(1, N)
for (k ← 1 to N)
print A[k]
endfor
procedure QuickSort(left, right)
if (left >= right)
return
endif
# Lomuto partition scheme
pivot ← A[right]
i ← left
for (j ← left to right - 1)
if (A[j] <= pivot)
SWAP_TEMP ← A[i]
A[i] ← A[j]
A[j] ← SWAP_TEMP
i ← i + 1
endif
endfor
SWAP_TEMP ← A[i]
A[i] ← A[right]
A[right] ← SWAP_TEMP
# 再帰呼び出し(境界チェック付き)
if (i - 1 > left)
call QuickSort(left, i - 1)
endif
if (i + 1 < right)
call QuickSort(i + 1, right)
endif
endprocedure
# ============================================
# 5. マージソート(Merge Sort)
# ============================================
# 分割統治法を使った安定ソート
# 時間計算量: O(n log n)
# 注意: このアプリでは動作しますが、作業用配列が必要です
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
# 作業用配列を初期化(配列は動的に作成される)
TEMP ← [ 0, 0, 0, 0, 0, 0 ]
call MergeSort(1, N)
for (k ← 1 to N)
print A[k]
endfor
procedure MergeSort(left, right)
# ベースケース: 要素が1つ以下の場合は終了
if (left >= right)
return
endif
# mid の計算(整数除算で中央値を求める)
# 例: left=1, right=5 → mid=3
# left=1, right=4 → mid=2
mid ← (left + right) // 2
# 左半分をソート(left < mid が保証されている)
call MergeSort(left, mid)
# 右半分をソート(mid + 1 <= right が保証されている)
call MergeSort(mid + 1, right)
# マージ処理
call Merge(left, mid, right)
endprocedure
procedure Merge(left, mid, right)
i ← left
j ← mid + 1
k ← left
while (i <= mid AND j <= right)
if (A[i] <= A[j])
TEMP[k] ← A[i]
i ← i + 1
else
TEMP[k] ← A[j]
j ← j + 1
endif
k ← k + 1
endwhile
while (i <= mid)
TEMP[k] ← A[i]
i ← i + 1
k ← k + 1
endwhile
while (j <= right)
TEMP[k] ← A[j]
j ← j + 1
k ← k + 1
endwhile
for (m ← left to right)
A[m] ← TEMP[m]
endfor
endprocedure
# ============================================
# 6. 降順ソート(Selection Sort使用)
# ============================================
# 大きい順に並べ替える
A ← [ 7, 3, 9, 4, 6 ]
N ← length(A)
for (i ← 1 to N - 1)
MAX_POS ← i
for (j ← i + 1 to N)
if (A[j] > A[MAX_POS])
MAX_POS ← j
endif
endfor
if (MAX_POS != i)
TEMP ← A[i]
A[i] ← A[MAX_POS]
A[MAX_POS] ← TEMP
endif
endfor
for (k ← 1 to N)
print A[k]
endfor