ID_DI
DI's study notes
ID_DI
전체 방문자
오늘
어제
  • 분류 전체보기 (85)
    • Deep-Learning (3)
      • CNN (2)
      • NLP (1)
    • Data_Python (6)
      • Numpy (0)
      • Matplotlib (4)
    • Python (8)
      • Python Algorithm (6)
    • Java (36)
      • Java(base) (33)
      • Java practice(base) (2)
    • Git (12)
    • Algorithm (7)
    • etc (7)
    • linux (1)
    • DeskSetup (0)
    • TIL_모각코 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • README.md
  • 커밋
  • java.net
  • git add.
  • Python
  • java
  • binarySearch
  • 합병정렬
  • 알고리즘
  • staged
  • Github
  • java 기초
  • string to int
  • 자바
  • java base
  • 정렬
  • 파이썬
  • matplotlib
  • java.lang
  • git

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ID_DI
Python/Python Algorithm

[python](알고리즘) quickSort 퀵정렬(랜덤 피봇) 구현

[python](알고리즘) quickSort 퀵정렬(랜덤 피봇) 구현
Python/Python Algorithm

[python](알고리즘) quickSort 퀵정렬(랜덤 피봇) 구현

2021. 10. 6. 00:24

quickSort 구현

랜덤 피봇 방법(random pivot)

import random

def swap(array, i, j): #array[i] 값과 array[j] 값 swap 함수
    tmp = array[i]
    array[i] = array[j]
    array[j] = tmp

def quick_sort(array, start, end):  #랜덤피봇의 퀵정렬
    if start >= end: #원소가 1개인 경우
        return 
    else:
        p = partition(array, start, end) #기준 피봇 결정
        quick_sort(array, start, p-1) #피봇기준 왼쪽 부분 재귀호출
        quick_sort(array, p+1, end) #피봇기준 오른쪽 부분 재귀호출

        return array

def partition(array, start, end):
        pivot_index = random.randint(start, end+1) #randint(n,m) n ~ m-1 까지 범위에서 난수 생성
        pivot = array[pivot_index]

        swap(array, pivot_index, end) #end(맨오른쪽)과 피봇과 값을 swap

        temp_index = start

        for i in range(start,end):
            if array[i] < pivot:
                swap(array, i, temp_index)
                temp_index += 1
        swap(array, end, temp_index)

        return temp_index

실행

data = [10, 3, 6, 2, 5, 1, 9, 8]
print(quick_sort(data, 0, len(data)-1))

실행결과

[1, 2, 5, 6, 8, 3, 9, 10]

피봇을 첫번째 원소로 설정하는 방법

def quick_sort(array, start, end):
    if start >= end: # 원소가 1개인 경우 종료
        return
    pivot = start # 피벗은 첫 번째 원소
    left = start + 1
    right = end

    while(left <= right):
        # 피벗보다 큰 데이터를 찾을 때까지 반복 
        while(left <= end and array[left] <= array[pivot]):
            left += 1
        # 피벗보다 작은 데이터를 찾을 때까지 반복
        while(right > start and array[right] >= array[pivot]):
            right -= 1
        if(left > right): # 엇갈렸다면 작은 데이터와 피벗을 교체
            array[right], array[pivot] = array[pivot], array[right]
        else: # 엇갈리지 않았다면 작은 데이터와 큰 데이터를 교체
            array[left], array[right] = array[right], array[left]
    # 분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬 수행
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

실행

data = [10, 3, 6, 2, 5, 1, 9, 8]
print(quick_sort(data, 0, len(data)-1))

실행결과

[1, 2, 5, 6, 8, 3, 9, 10]

'Python > Python Algorithm' 카테고리의 다른 글

[python](알고리즘) mergeSort 병합정렬(합병정렬) 구현  (0) 2021.10.01
[python] factorial 함수, 재귀함수 구현  (0) 2021.08.27
[python] (알고리즘) binarySearch (이진탐색) 구현  (0) 2021.08.27
[python](자료구조) Queue class 구현  (0) 2021.08.25
[python](자료구조) stack class 구현  (0) 2021.08.25
  • 랜덤 피봇 방법(random pivot)
  • 피봇을 첫번째 원소로 설정하는 방법
'Python/Python Algorithm' 카테고리의 다른 글
  • [python](알고리즘) mergeSort 병합정렬(합병정렬) 구현
  • [python] factorial 함수, 재귀함수 구현
  • [python] (알고리즘) binarySearch (이진탐색) 구현
  • [python](자료구조) Queue class 구현
ID_DI
ID_DI
Computer Vision

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.