파이썬 초보자가 퀵 정렬을 정리
이것은 비망록
정말로 잊을 것 같아
인용 사이트
이번에는 먼저 정리하기 위해 배견 한 사이트를 소개하겠습니다.
각각 조금만 알고리즘 자체가 다릅니다만 같은 퀵 소트이므로 @muijp 씨의 알고리즘을 바탕으로 정리하겠습니다
프로그램
@ muijp 님의 퀵 정렬 에 요전날 @shiracamus 씨로부터 어드바이스를 받은 랜덤 배열의 프로그램과 디버그용의 출력을 넣었습니다
q_sort.pydef qSort(a):
print(a)#デバッグ用
if len(a) in (0, 1):
return a
p = a[-1]
l = [x for x in a[:-1] if x <= p]
r = [x for x in a[:-1] if x > p]
return qSort(l) + [p] + qSort(r)
a = r.sample(range(1,11),k=9)
qSort(a)
#出力_____________________
[3, 7, 1, 6, 9, 8, 2, 10, 4]
[3, 1, 2]
[1]
[3]
[7, 6, 9, 8, 10]
[7, 6, 9, 8]
[7, 6]
[]
[7]
[9]
[]
>>[1, 2, 3, 4, 6, 7, 8, 9, 10]
그래, 프로그램이 너무 간결해서 모르겠어.
분해하고 생각하다
우선 주목해야 할 곳은return qSort(l) + [p] + qSort(r)
라고 생각한다.
이거는 퀵 소트의 특징인 「피팟(주목하고 있는 셀)」의 오른쪽과 왼쪽에 작은 숫자(배열)와 큰 숫자(배열)를 둔다는 부분이 된다.
추적 참고
이 사이트의 gif를 보면
1. 한가운데 피포트를 취한다
2. 바깥쪽에서 순서대로 왼쪽에 있는 작은 수와 오른쪽에 있는 큰 수를 교환합니다.
3. 스캔 범위를 최소 ~ 피팟으로 변경하고 중앙에 피팟을 가져옵니다.
를 반복하고 있는 것을 알 수 있다.
다만 이번 프로그램에서는p = a[-1]
로 피팟을 마지막 숫자로 가져가
그리고,
l = [x for x in a[:-1] if x <= p]
r = [x for x in a[:-1] if x > p]
그리고, 피팟트보다 큰 숫자와 피팟트보다 작은 숫자로 나누고, 그것을 return
로 (재기함수를 부르면서) 접합하고 있다.
첫if len(a) in (0, 1):
return a
는 문자가 1문자 이하라면 그것을 재기함수의 반환값으로서 돌려주고 있다.
추적하기
이상을 바탕으로 방금전의 난수로 추적해 보자
#出力_____________________
[3, 7, 1, 6, 9, 8, 2, 10, 4]
[3, 1, 2]
[1]
[3]
[7, 6, 9, 8, 10]
[7, 6, 9, 8]
[7, 6]
[]
[7]
[9]
[]
>>[1, 2, 3, 4, 6, 7, 8, 9, 10]
배열[3, 7, 1, 6, 9, 8, 2, 10, 4]
피팟 p = 4
작은 배열 l = {3,1,2}
큰 배열 r={7,6,9,8,10}
로 분해
작은 배열을 재기하고,
p=2
l={1}, r={3}
및 분해
각각 1개까지 분해되었으므로 확정한다
큰 배열을 재기하면, 이번 p는 10으로 최대이므로,
l={7,6,9,8} , r={}
로 분해
그런 다음 모든 수를 세분화합니다.
결합된 데이터로 반환
그리고 있습니다.
사이고에게
이번은 거의 둥근 파크리가 되어 버렸습니다만, 어떻게 자신이 이해하고 있지 않는가를 알고 버렸습니다.
이런 기회가 있어서 정말 좋았습니다.
Reference
이 문제에 관하여(파이썬 초보자가 퀵 정렬을 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sola_wing529/items/692685f10566cb2497f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def qSort(a):
print(a)#デバッグ用
if len(a) in (0, 1):
return a
p = a[-1]
l = [x for x in a[:-1] if x <= p]
r = [x for x in a[:-1] if x > p]
return qSort(l) + [p] + qSort(r)
a = r.sample(range(1,11),k=9)
qSort(a)
#出力_____________________
[3, 7, 1, 6, 9, 8, 2, 10, 4]
[3, 1, 2]
[1]
[3]
[7, 6, 9, 8, 10]
[7, 6, 9, 8]
[7, 6]
[]
[7]
[9]
[]
>>[1, 2, 3, 4, 6, 7, 8, 9, 10]
우선 주목해야 할 곳은
return qSort(l) + [p] + qSort(r)
라고 생각한다.이거는 퀵 소트의 특징인 「피팟(주목하고 있는 셀)」의 오른쪽과 왼쪽에 작은 숫자(배열)와 큰 숫자(배열)를 둔다는 부분이 된다.
추적 참고
이 사이트의 gif를 보면
1. 한가운데 피포트를 취한다
2. 바깥쪽에서 순서대로 왼쪽에 있는 작은 수와 오른쪽에 있는 큰 수를 교환합니다.
3. 스캔 범위를 최소 ~ 피팟으로 변경하고 중앙에 피팟을 가져옵니다.
를 반복하고 있는 것을 알 수 있다.
다만 이번 프로그램에서는
p = a[-1]
로 피팟을 마지막 숫자로 가져가그리고,
l = [x for x in a[:-1] if x <= p]
r = [x for x in a[:-1] if x > p]
그리고, 피팟트보다 큰 숫자와 피팟트보다 작은 숫자로 나누고, 그것을 return
로 (재기함수를 부르면서) 접합하고 있다.첫
if len(a) in (0, 1):
return a
는 문자가 1문자 이하라면 그것을 재기함수의 반환값으로서 돌려주고 있다.추적하기
이상을 바탕으로 방금전의 난수로 추적해 보자
#出力_____________________
[3, 7, 1, 6, 9, 8, 2, 10, 4]
[3, 1, 2]
[1]
[3]
[7, 6, 9, 8, 10]
[7, 6, 9, 8]
[7, 6]
[]
[7]
[9]
[]
>>[1, 2, 3, 4, 6, 7, 8, 9, 10]
배열[3, 7, 1, 6, 9, 8, 2, 10, 4]
피팟 p = 4
작은 배열 l = {3,1,2}
큰 배열 r={7,6,9,8,10}
로 분해
작은 배열을 재기하고,
p=2
l={1}, r={3}
및 분해
각각 1개까지 분해되었으므로 확정한다
큰 배열을 재기하면, 이번 p는 10으로 최대이므로,
l={7,6,9,8} , r={}
로 분해
그런 다음 모든 수를 세분화합니다.
결합된 데이터로 반환
그리고 있습니다.
사이고에게
이번은 거의 둥근 파크리가 되어 버렸습니다만, 어떻게 자신이 이해하고 있지 않는가를 알고 버렸습니다.
이런 기회가 있어서 정말 좋았습니다.
Reference
이 문제에 관하여(파이썬 초보자가 퀵 정렬을 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sola_wing529/items/692685f10566cb2497f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#出力_____________________
[3, 7, 1, 6, 9, 8, 2, 10, 4]
[3, 1, 2]
[1]
[3]
[7, 6, 9, 8, 10]
[7, 6, 9, 8]
[7, 6]
[]
[7]
[9]
[]
>>[1, 2, 3, 4, 6, 7, 8, 9, 10]
이번은 거의 둥근 파크리가 되어 버렸습니다만, 어떻게 자신이 이해하고 있지 않는가를 알고 버렸습니다.
이런 기회가 있어서 정말 좋았습니다.
Reference
이 문제에 관하여(파이썬 초보자가 퀵 정렬을 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sola_wing529/items/692685f10566cb2497f8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)