[アルゴリズム]ソート要約
20076 ワード
1.ソート
sortは、特定の基準に基づいてデータをリストします.
通常、状況や条件に応じて、適切なアルゴリズムを使用するのは式のようです.
1-1. ソケットの選択
「未処理のデータ」で、最小のデータを先頭に移動するアルゴリズムを選択します.
時間複雑度は等差数列式によりO(n^2)となる.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(len(array)):
min_index = i
for j in range(i+1, len(array)):
if array[min_index] > array[j]:
min_index = j
array[min_index], array[i] = array[i], array[min_index]
print(array)
1-2. 列全体の挿入
これは,未処理のデータを選択することにより適切な位置を判断して挿入するアルゴリズムである.
選択ソートと同様に,二重反復文を用いたソートはO(N^2)の時間的複雑さを持つが,データがある程度ソート状態にある場合,選択ソートよりも効率的に適用できる.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(1, len(array)):
for j in range(i, 0, -1): #인덱스 i부터 1까지 1부터 감소
if array[j] < array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break #현재 반복문 종료, 다음 반복 강제 실행
print(array)
1-3. クイックソート
基準データ(pivot)を設定し、pivot値を基準に、小さなデータと大きなデータをナビゲートして変換し、pivotに基づいてデータパケットを行います.
マージソートと同様に、通常のソートアルゴリズムによく使用されるアルゴリズムであり、プログラミング言語自体をソートライブラリとして使用することもできます.
基本クイックソートは、最初のデータを基準データ(pivot)に設定し、データパケット後、各データセットに対してクイックソートを繰り返し呼び出します.
時間的複雑度は平均O(N*logN)であり,ある程度並べ替えが行われているとpivotは並べ替えに偏り,複雑度をO(N^2)に増加させる.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end : #정렬원소가 1개일 경우 정렬완료, 재귀종료
return #정렬된 상태이므로 별도 반환 값이 없어도 됨
#전체 함수의 return을 유심히 살펴볼 것
pivot = start
left = start+1
right = end
while left <= right:
#피벗보다 큰 데이터
while left <= end and array[left] < array[pivot]:
left = left+1
#피벗보다 작은 데이터
while right > start and array[right] > array[pivot]:
right = right-1
if left <= right: #엇갈리지 않은 경우
array[left], array[right] = array[right], array[left]
else : #엇갈린 경우
array[right], array[pivot] = array[pivot], array[right]
quick_sort(array, start, right-1)
quick_sort(array, right+1, end)
quick_sort(array, 0, len(array)-1)
print(array)
※Pythonのコードはシンプルで、複数の機能を簡単に実現でき、コードを簡潔に表現できます.関数全体を用いた場合,関数の戻り値が存在するか,あるいはどのような形で返されるかを判断することで,再帰条件などの戻り文をうまく設定できる.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
print(array)
if len(array) <= 1:
#left_side에서 첫번째 원소가 0일 경우, array가 empty될 수 있음
#따라서 탈출조건은 empty경우를 고려하여 =< 1이 되는 것이 좋음
return array
pivot = array[0] #pivot값
tail = array[1:] #pivot을 제외한 리스트
left_side = [x for x in tail if x <= pivot]
#데이터묶음을 pivot보다 작은 값들로
right_side = [x for x in tail if x > pivot]
#데이터묶음을 pivot보다 큰 값들로
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
1-4. ソケット数
特定の条件下(データサイズ範囲が限られており、整数で表すことができる)では、非常に迅速にソートできる方法です.
時間複雑度は常にO(N+K)(Nはデータ個数、Kはデータ中の最大値)である.
同じデータが複数回現れると、それを有効に利用することができます.
1-5. 適用例
A,Bの配列が2つあります.
2つの配列はN個の元素からなり,いずれも自然数である.
この場合、K回まで置換することができ、置換はA、Bを配列する要素を交換することを意味する.
アルゴリズムを最終アレイAの要素と最大に設定する場合、作成できるアレイAのすべての要素値の合計の最大値は?
import sys
n, k = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
a.sort()
b.sort(reverse=True)
for i in range(k):
if a[i] < b[i]:
a[i], b[i] = b[i], a[i]
else:
break #바로 다음 반복문 실행
print(sum(a))
2.ソート間比較
Reference
この問題について([アルゴリズム]ソート要約), 我々は、より多くの情報をここで見つけました https://velog.io/@gyrbs22/알고리즘-정렬-총정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol