python 3 일반적인 정렬 알고리즘 구현(예시 코드)
거품 정렬 은 간단 한 정렬 알고리즘 이다.그것 은 정렬 할 수열 을 반복 적 으로 방문 하여 한 번 에 두 요 소 를 비교 한 적 이 있 으 며,만약 그들의 순서 가 틀 리 면 그것들 을 교환 할 것 이다.방문 수열 작업 은 더 이상 교환 이 필요 하지 않 을 때 까지 반복 적 으로 진행 된다.즉,이 수열 은 이미 정렬 이 완료 되 었 다 는 것 이다.이 알고리즘 의 이름 은 작은 요소 일수 록 교환 을 통 해 서서히 수열 의 맨 위로 떠 오 르 기 때문이다.
def mao(lst):
for i in range(len(lst)):
# ,
#
# i , i
# len-1 -i len-1
# 0 len -1 -i
# flag
# flag ( ), ,
flag = False
for j in range(len(lst) - i - 1):
if lst[j] > lst[j + 1]:
lst[j], lst[j + 1] = lst[j + 1], lst[j]
flag = True
# , flag
if not flag:
return lst
return lst
print(mao([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
정렬 선택정렬 을 선택 하 는 것 은 간단 하고 직관 적 인 정렬 알고리즘 이다.그의 작업 원리:먼저 정렬 되 지 않 은 시퀀스 에서 최소(큰)요 소 를 찾 아 정렬 된 시퀀스 의 시작 위치 에 저장 한 다음 에 나머지 정렬 되 지 않 은 요소 에서 최소(큰)요 소 를 계속 찾 은 다음 에 정렬 된 시퀀스 의 끝 에 놓 습 니 다.모든 요소 가 정렬 될 때 까지 유추 합 니 다.
#
# , 。
#
# 0 i , i+1 len(lst)-1
def select_sort(lst):
for i in range(len(lst)):
min_index = i #
for j in range(i + 1, len(lst)):
if lst[j] < lst[min_index]:
min_index = j
# , ,min_index i+1 len(lst) - 1
lst[i], lst[min_index] = lst[min_index], lst[i]
return lst
def select_sort2(lst):
#
#
# min_index
# i i+1 len(lst)
for i in range(len(lst)):
for j in range(len(lst) - i):
# lst[i + j] i len(lst)-1
# j <= len(lst) -i j + i <= len(lst)
if lst[i] > lst[i + j]:
# ,
lst[i], lst[i + j] = lst[i + j], lst[i]
return lst
print(select_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
print(select_sort2([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
빠 른 정렬빠 른 정렬 은 한 번 의 정렬 을 통 해 대기 기록 을 독립 된 두 부분 으로 나 누 는 것 이다.그 중에서 일부 기록 의 키 워드 는 모두 다른 부분의 키워드 보다 작 으 면 각각 이 두 부분의 기록 을 계속 정렬 하여 전체 서열 의 질 서 를 달성 할 수 있다.
#
# 1. i
# 2. i ,
# 3.
# 4. , 1
# 5.
def quicksort(lst):
if len(lst) < 2: # lst
return lst
# ['pɪvət]
pivot = lst[0]
less_lst = [i for i in lst[1:] if i <= pivot]
greater_lst = [i for i in lst[1:] if i > pivot]
#
# + +
# + + + + + +
# ........... + + ............
return quicksort(less_lst) + [pivot] + quicksort(greater_lst)
print(quicksort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
print(quicksort([1, 5, 8, 62]))
삽입 정렬정렬 을 삽입 하 는 알고리즘 설명 은 간단 하고 직관 적 인 정렬 알고리즘 이다.그것 의 작업 원 리 는 질서 있 는 서열 을 구축 하여 정렬 되 지 않 은 데이터 에 대해 정렬 된 서열 에서 뒤로 스 캔 하여 해당 하 는 위 치 를 찾 아 삽입 하 는 것 이다.
# lst [0, i) ,
# i lst[i] lst[0 : i]
# ,lst[i] ,
# ,lst[i] , j , lst[j]
# lst[i+1] (lst[i+1] lst[i])
#
# ,
def insert_sort(lst: list):
# 1 , 0
#
for i in range(1, len(lst)):
# 0 , lst[0]
for j in range(i):
if lst[i] < lst[j]:
lst.insert(j, lst[i])
# lst[i] j ,j +1 , lst[i+1]
del lst[i + 1]
return lst
print(insert_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
힐 정렬힐 정렬 은 1959 년 에 Shell 이 발명 한 것 으로 첫 번 째 로 O(n2)를 돌파 한 정렬 알고리즘 으로 정렬 을 간단하게 삽입 하 는 개선 판 입 니 다.정렬 을 삽입 하 는 것 과 다른 점 은 거리 가 먼 요 소 를 우선 시 한 다 는 점 이다.힐 정렬 은 축소 증분 정렬 이 라 고도 한다.
힐 정렬
#
# 1. :
#
# , lst
# 2. ,
# 3. :
#
#
# 4.
# 5. 1,
#
def shell_sort(lst):
lst_len = len(lst)
gap = lst_len // 2 # 2,
while gap >= 1: # 0
for i in range(gap, lst_len):
temp = lst[i]
j = i
#
while j - gap >= 0 and lst[j - gap] > temp:
lst[j] = lst[j - gap]
j -= gap
lst[j] = temp
gap //= 2
return lst
print(shell_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
#
# gap = 2
# [5, 2, 4, 3, 1]
# [5, 4, 1] [2, 3]
# [1, 4, 5, 2, 3]
# gap = 1
# [1, 2, 3, 4, 5]
#
# gap = 3
# [5, 2, 4, 3, 1, 6]
# [5, 3] [2, 1] [4,6]
# [3, 5, 1, 2, 4 , 6]
# gap = 1
# [1, 2, 3, 4, 5, 6]
병렬 정렬병합 정렬 은 병합 작업 에 있어 서 효과 적 인 정렬 알고리즘 입 니 다.이 알고리즘 은 분 치 법(Divide and Conquer)을 사용 한 매우 전형 적 인 응용 이다.기 존 서열 의 하위 서열 을 합쳐서 완전히 질서 있 는 서열 을 얻는다.즉,모든 하위 서열 을 질서 있 게 한 다음 에 하위 서열 을 질서 있 게 하 는 것 이다.두 개의 질서 표를 하나의 질서 표 로 합치 면 2-로 병합 이 라 고 한다.
병렬 정렬
#
# lst
#
#
# ,
#
# ,
def merge(left, right):
# left , ( merge)
# right
res = []
while left and right:
item = left.pop(0) if left[0] < right[0] else right.pop(0)
res.append(item)
# ,left right , extend
# ,left right ,
res.extend(left)
res.extend(right)
return res
def merge_sort(lst):
lst_len = len(lst)
if lst_len <= 1:
return lst
mid = lst_len // 2
lst_right = merge_sort(lst[mid:len(lst)]) # lst_len <= 1 lst merge
lst_left = merge_sort(lst[:mid]) # lst_len <= 1 lst merge
return merge(lst_left, lst_right) # ,lst_left lst_right
print(merge_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
더미 정렬쌓 기 정렬 은 쌓 기 라 는 데이터 구 조 를 이용 하여 디자인 한 정렬 알고리즘 을 말한다.퇴적 은 완전 이 진 트 리 와 비슷 한 구조 이 며,동시에 퇴적 의 성질 을 만족 시 킵 니 다.즉,하위 노드 의 키 나 색인 은 항상 부모 노드 보다 작 습 니 다.그리고 정렬 을 합 니 다.
더미 정렬
#
# ( ) : ( ),
#
# ----
#
# ----
#
# lst = [1, 22 ,11, 8, 12, 4, 9]
# 1. :
# 1
# / \
# 22 11
# / \ / \
# 8 12 4 9
#
# 2. , , : <=
#
# 1 1 1
# / \ 13 22 / \ 4 11 / \
# 22 11 ==============> 13 11 ==============> 13 4
# / \ / \ / \ / \ / \ / \
# 13 14 4 9 22 14 4 9 22 14 11 9
#
# 3. , ,
#
# 1
# /
# ~~~~/
# 22
# / \
# 8 4
# \ / \
# 12 11 9
#
# 4. , , ,。。。。
#
# 1 1 1 4 1 4 1 4 8 1 4 8
# / / / / / /
# ~~~/ ~~~/ ~~~/ ~~~/ ~~~/ ~~~/
# 22 4 22 8 22 9
# / \ / \ / \ / \ / \ / \
# 8 4 8 9 8 9 12 9 12 9 12 11
# \ / \ \ / \ \ / \ / / /
# 12 11 9 12 11 22 12 11 22 11 11 22
#
# :
# 1 4 8 9 1 4 8 9 1 4 8 9 11 1 4 8 9 11 1 4 8 9 11 12 ==> 1 4 8 9 11 12 22
# / / / / /
# ~~~/ ~~~/ ~~~/ ~~~/ ~~~/
# 22 11 22 12 22
# / \ / \ / /
# 12 11 12 22 12 22
#
#
def heapify(lst, lst_len, i):
""" """
less = i # largest
left_node_index = 2 * i + 1 #
right_node_index = 2 * i + 2 #
# lst[i] ( ):
#
# lst[i]
# / \
# lst[2*i + 1] lst[ 2*i + 2]
#
# , , ‘>' ‘<'
#
if left_node_index < lst_len and lst[less] > lst[left_node_index]:
less = left_node_index
if right_node_index < lst_len and lst[less] > lst[right_node_index]:
#
less = right_node_index
if less != i:
# , ,
lst[i], lst[less] = lst[less], lst[i] #
heapify(lst, lst_len, less)
# ,
def heap_sort(lst):
res = []
i = len(lst)
lst_len = len(lst)
for i in range(lst_len, -1, -1):
# ,
heapify(lst, lst_len, i)
# ,
# , , ( ) ,
for j in range(lst_len - 1, 0, -1):
lst[0], lst[j] = lst[j], lst[0] # , j
heapify(lst, j, 0) # [0: j) [j: lst_len-1]
return lst
arr = [1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]
print(heap_sort(arr))
참고:10 대 고전 정렬 알고리즘(동 도 프 리 젠 테 이 션)
데이터 구조 와 알고리즘-정렬 편-python 설명
움 직 이 는 그림 은 여 기 를 클릭 하여 볼 수 있다.
나의 github
내 블 로그
나의 노트
python 3 에서 흔히 볼 수 있 는 정렬 알고리즘(예제 코드)을 실현 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 정렬 알고리즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.