개발머해니

[파이썬] 퀵정렬 (1) partition 함수 - 분할정복 ★ 본문

알고리즘

[파이썬] 퀵정렬 (1) partition 함수 - 분할정복 ★

왕행님 2023. 9. 17. 17:33
728x90
반응형

실습 설명

partition 함수를 작성하세요.

partition 함수는 리스트 my_list, 그리고 partition할 범위를 나타내는 인덱스 start와 인덱스 end를 파라미터로 받습니다. my_list의 값들을 pivot 기준으로 재배치한 후, pivot의 최종 위치 인덱스를 리턴해야 합니다.

예시 1

Pivot(기준점)은 마지막 인덱스에 있는 5.

list1 = [4, 3, 6, 2, 7, 1, 5]
pivot_index1 = partition(list1, 0, len(list1) - 1)
print(list1)
print(pivot_index1)
[4, 3, 2, 1, 5, 6, 7]
4

5보다 작은 값들은 왼쪽에, 5보다 큰 값들은 오른쪽에 배치됩니다.

예시 2

Pivot(기준점)은 마지막 인덱스에 있는 4.

list2 = [6, 1, 2, 6, 3, 5, 4]
pivot_index2 = partition(list2, 0, len(list2) - 1)
print(list2)
print(pivot_index2)
[1, 2, 3, 4, 6, 5, 6]
3

4보다 작은 값들은 왼쪽에, 4보다 큰 값들은 오른쪽에 배치됩니다.

partition 함수를 작성하다 보면 코드가 꽤나 지저분해질 수 있습니다. 특히 리스트에서 값들의 위치를 바꿔주는 경우가 많은데요. 코드가 지저분해지는 걸 방지하기 위해서 swap_elements라는 함수를 먼저 작성하는게 좋습니다.

list1 = [1, 2, 3, 4, 5, 6]
swap_elements(list1, 2, 5)  # 2번 인덱스 값과 5번 인덱스 값 위치 바꿈
print(list1)                # => [1, 2, 6, 4, 5, 3]

 

실습 결과

# 두 요소의 위치를 바꿔주는 helper function
def swap_elements(my_list, index1, index2):
    temp = my_list[index1]
    my_list[index1] = my_list[index2]
    my_list[index2] = temp


# 퀵 정렬에서 사용되는 partition 함수
def partition(my_list, start, end):
    # 리스트 값 확인과 기준점 이하 값들의 위치 확인을 위한 변수 정의
    i = start
    b = start
    p = end

    # 범위안의 모든 값들을 볼 때까지 반복문을 돌린다
    while i < p:
        # i 인덱스의 값이 기준점보다 작으면 i와 b 인덱스에 있는 값들을 교환하고 b를 1 증가 시킨다
        if my_list[i] <= my_list[p]:
            swap_elements(my_list, i, b)
            b += 1
        i += 1

    # b와 기준점인 p 인덱스에 있는 값들을 바꿔준다
    swap_elements(my_list, b, p)
    p = b

    # pivot의 최종 인덱스를 리턴해 준다
    return p


# 테스트 코드 1
list1 = [4, 3, 6, 2, 7, 1, 5]
pivot_index1 = partition(list1, 0, len(list1) - 1)
print(list1)
print(pivot_index1)

# 테스트 코드 2
list2 = [6, 1, 2, 6, 3, 5, 4]
pivot_index2 = partition(list2, 0, len(list2) - 1)
print(list2)
print(pivot_index2)
[4, 3, 2, 1, 5, 6, 7]
4
[1, 2, 3, 4, 6, 5, 6]
3

 

728x90
반응형