Ch 03. 分割征服アルゴリズム(1)
9199 ワード
分割征服アルゴリズムとは?
コンセプト
プロセス
入力サイズnの場合、
총 분할 횟수
k=log n
種類
連結ソート
コンセプト
に道を教える
インプリメンテーション
Pseudo-code
MergeSort(A, p, q): #배열 A, 첫 인덱스 p, 끝 인덱스 q
if p < q: #배열 내 원소가 2개 이상일 때
k = (p + q) // 2 #절반 위치 인덱스(몫만 취함)
MergeSort(A, p, k) #앞부분 순환 호출
MergeSort(A, k + 1, q) # 뒷부분 순환 호출
Merge(A, p, q) #부분 배열 합병 정렬
時間の複雑さ
分割時間の複雑さ:O(1)
連結回数:logn
レベル別比較ソート数:n
したがって,集計ソート時間の複雑さ:
O(nlogn)
くうかんふくざつさ
O(n)
特性/利点
短所
適用
クイックソート
コンセプト
に道を教える
インプリメンテーション
1.アレイに複数の要素がある場合、
1-1. ピボットに沿って配列されたA[左]からA[右]を選択
1-2. SWAP(A[left],ピボットに沿って);
1-3. 軸より小さい数値を左に移動し、軸より大きい数値を右に移動します.
2.軸心より1回循環するプロセス
3.ピボットより大きいグループ1サイクルプロセス
Python
def quick_sort(arr, start, end):
if start >= end: return
pivot = arr[start] # 피벗은 첫번째 원소
l, r = start + 1, end
while l <= r:
while l <= end and arr[l] <= arr[pivot]:
l += 1
while r > start and arr[r] >= arr[pivot]:
r -= 1
if l > r:
arr[r], arr[pivot] = arr[pivot], arr[r]
else:
arr[r], arr[l] = arr[l], arr[r]
quick_sort(arr, start, r - 1)
quick_sort(arr, r + 1, end)
A = [5, 3, 8, 4, 9, 1, 6, 2, 7, 10]
print(quick_sort(A, 0, len(A)))
時間の複雑さ
O(n^2)
軸心최소/최대
数字O(nlog n)
-半分に分割した場合(=集計ソート)O(nlog n)
ピボットの選択方法
クイックソートのパフォーマンスは軸の左右に依存します!
pivot = median{K[l], K[(l+r)/2], K[r]}
パフォーマンスの向上
適用/利点
+時間複雑度:マージソートVSクイックソート
Reference
この問題について(Ch 03. 分割征服アルゴリズム(1)), 我々は、より多くの情報をここで見つけました https://velog.io/@gamza363/Ch-03.-분할-정복-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol