Python 데이터 구조 ----- 빠른 정렬을 위한 재귀

목차

머리말:

빠른 정렬

1. 개념

 2. 예시

파이썬 코드 구현

재귀적 빠른 정렬


머리말:

         오늘 우리는 퀵 정렬의 사고 방식을 함께 배우고 파이썬 언어를 사용하여 퀵 정렬의 기능을 실현할 것입니다. 오늘의 학습을 시작하겠습니다!

빠른 정렬

1. 개념

        퀵 정렬은 사실 버블 정렬의 개선된 형태로 정렬 속도가 빠르고 시간 복잡도가 작으며 많은 프로그래밍 언어에서 캡슐화된 정렬 방법이 되었습니다.

로직 구현

Quicksort는 분할 정복 전략을 사용하여 시퀀스(목록)를 두 개의 하위 시퀀스(하위 목록)로 나눕니다.

① "pivot"이라는 배열에서 요소를 선택합니다.
② 배열을 재정렬합니다. 피벗 값보다 작은 모든 요소는 피벗 앞에 배치되고 피벗 값보다 큰 모든 요소는 피벗 뒤에 배치됩니다(같은 숫자 양쪽으로 갈 수 있습니다). 이 파티션이 종료된 후 벤치마크는 시퀀스의 중간에 있습니다. 이것을 분할 작업이라고 합니다.
③ 기준 값보다 작은 요소의 하위 시퀀스와 기준 값보다 큰 요소의 하위 시퀀스를 재귀적으로 정렬합니다.

아래쪽으로 재귀할 때 배열의 크기는 0 또는 1입니다. 즉, 정렬되었습니다. 이 알고리즘은 각 반복(반복)에서 적어도 하나의 요소를 마지막 위치에 놓기 때문에 확실히 종료됩니다.

 다이어그램은 다음과 같습니다.

퀵 정렬을 위한 네 가지 최적화

 2. 예시

다음은 이 숫자 집합을 정렬하기 위한 일련의 숫자 3,5,7,1,3,6입니다.

 첫 번째 단계 는 벤치마크 번호 temp를 선택하는 것입니다. 일반적으로 첫 번째 숫자는 벤치마크 번호로 사용되며 각각 헤드와 테일인 i와 j의 위치를 ​​표시합니다.

 2단계 는 i<j를 전제로 j와 i의 이동을 시작하는 것으로, j를 먼저 이동한 후 i를 이동시키는 원리로, j가 i가 가리키는 수보다 작은 수를 만나면 이동을 멈추고 그 다음 i가 움직이기 시작하고 i가 temp보다 큰 숫자를 만나면 움직임을 멈추고 이때 i와 j가 가리키는 숫자를 교환하기 시작합니다.

3단계에서 i와 j가 만나는 위치로 이동할 때 i와 j가 가리키는 숫자를 temp로 교환하면 교환된 숫자의 오른쪽이 이 숫자보다 큰 것을 알 수 있고, 왼쪽이 이 숫자보다 크고 이 숫자보다 작습니다.

 네 번째 부분 은 재귀를 입력하는 부분인데 이때 이전 단계에서 i와 j의 교환으로 가리키는 숫자의 왼쪽과 오른쪽에서 재귀를 해야 합니다. 다시 처리하고 최종 결과는 정렬된 숫자입니다.

파이썬 코드 구현

재귀적 빠른 정렬

#快速排序
import random as r

def quick(left,right,li):
    if left>right:
        return
    temp=li[left]#获取到数组第一个数字
    i=left #标记i 的位置
    j=right #标记 j的位置
    while i!=j:
        while li[j]>=temp and i<j:
            j-=1
        while li[i]<=temp and i<j:
            i+=1
        if i<j:
            li[i],li[j]=li[j],li[i] #数字交换
    li[left],li[i]=li[i],li[left] #当i和j相遇的时候,进行与temp数字交换

    quick(left,i-1,li) #左边进入递归
    quick(i+1,right,li) #右边进入递归
    return

if __name__ == '__main__':
    li=[r.randint(0,20) for _ in range(10)]
    print(li)
    quick(0,len(li)-1,li)
    print(li)
#输出结果:
#[2, 11, 20, 5, 13, 16, 11, 14, 20, 8]
#[2, 5, 8, 11, 11, 13, 14, 16, 20, 20]

 그럼 오늘은 여기까지입니다. 다음 호에서 만나요!

배경화면 공유:

추천

출처blog.csdn.net/m0_73633088/article/details/130268352