이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

[이코테]CHAPTER 06 정렬 - 퀵정렬- 파이썬(Python)

  • 2022.05.15 23:00
  • Study Platform📚/(알고리즘)- [이코테] 이것이 코딩테스트다 정리
    반응형

    1) 퀵 정렬

    : 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸기. 피벗(Pivot)(교환하기 위한 기준) 사용

     

     -  호어 분할 방식(Hoare Partition)

        1. 리스트에서 첫번째 데이터를 피벗 설정

        2. 리스트 왼쪽에서부터 피벗보다 큰 데이터를 찾고, 오른쪽에서는 피벗보다 작은 데이터를 찾기

     

        3. 큰 데이터와 작은 데이터 교환

    1. '5'보다 큰 데이터를 선택하므로 왼쪽에서부터 '5'보다 큰 '7' <->오른쪽에서부터 '5'보다 작은 '4' 둘이 변경 
    2. '5'보다 큰 데이터를 선택하므로 왼쪽에서부터 '9' 선택 <-> 오른쪽에서부터 '2' 둘이 변경
    3. '5'보다 큰 데이터를 선택하므로 왼쪽에서부터 '6' 선택, 오른쪽에서부터 '1' 선택하였는데 이렇게 두 값이 엇갈린 경우 작은 데이터('1')와 피벗의 위치('5')를 변경
    4. 피벗의 왼쪽에는 피벗보다 작은 데이터가 위치, 피벗의 오른쪽에는 피벗보다 큰 데이터를 위치하여 왼쪽 리스트와 오른쪽 리스트를 개별적으로정렬

    1. 오른쪽 리스트에서는 '1'을 피벗으로, 왼쪽 리스트에서는 '6'을 피벗으로 설정
        오른쪽 리스트는 왼쪽에서부터 '1'보다 큰  '4'<->오른쪽에서부터 '1'보다 작은 '0'
        왼쪽 리스트는 왼쪽에서부터 '6'보다 큰 '9', 오른쪽에서부터 '6'보다 작은 값 존재 하지 않으므로 그대로 유지
    2. 오른쪽 리스트 왼쪽에서부터 '1'보다 큰 '4', 왼족에서부터 '1'보다 작은 '0'을 선택하였는데 
        이렇게 두 값이 엇갈린 경우 작은 데이터('0')과 피벗의 위치('1')를 변경
    3. 따라서, 0, 1, 5, 6은 위치 고정

    1. 오른쪽 리스트에서는 '2'를 피벗으로, 왼쪽 리스트에서는 '9'를 피벗으로 설정
       오른쪽 리스트는 왼쪽에서부터 '2'보다 큰 '4', 오른쪽에서부터는 '2'보다 작은 값이 존재하지 않으므로 그대로 유지

       왼쪽 리스트는 왼쪽에서부터 '9'보다 큰 데이터 없음 . 
           오른쪽에서부터 작은 '8'을 선택하였는데 두 값이 엇갈렸으므로 피벗의 위치('9')와 작은 데이터('8')을 변경
    2. 따라서 이번에는 2, 9위치가 고정되어서 0,1,2,5,6,9 위치가 고정된다.

    1. 오른쪽 리스트에서튼 '4'를 피벗으로, 왼쪽 리스트에서는 '8'를 피벗으로 설정
       오른쪽 리스트는 왼쪽에서부터 '4'보다 큰 데이터 존재하지 않고, 오른쪽에서부터 '4'보다 작은 데이터 '3'이므로 
          피벗의 위치('4')와 작은 데이터('3')을 변경.
       왼쪽 리스트는 왼쪽에서부터 '8'보다 큰 데이터 존재하지 않고, 오른쪽에서부터 '8'보다 작은 데이터 '7'이므로 
          피벗의 위치('8')와 작은 데이터('7')을 변경
    2. 정렬 완료
    array = [5,7,9,0,3,1,6,2,4,8]
    
    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 start<=right 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)
        
    quick_sort(array,0,len(array)-1)
    print(array)

    파이썬 장점을 살린 퀵 정렬 소스코드

    array = [5,7,9,0,3,1,6,2,4,8]
    def quick_sort(array):
        #리스트 하나 이하의 원소만을 담고 있다며 종료
        if len(array)<=1:
            return array
        pivot=array[0] #피벗을 첫번째 원소
        tail=array[1:] #피벗을 제외한 리스트
        
        #피벗보다 작은 값은 왼쪽 배치
        left_side=[x for x in tail if x<=pivot] #분할된 왼쪽 부분
        #피벗보다 큰 값은 오른쪽 배치
        right_side=[x for x in tail if x>pivot] #분할된 오른쪽 부분
        
        return quick_sort(left_side)+[pivot]+quick_sort(right_side)
    
    print(quick_sort(array))

    퀵 정렬의 시간 복잡도 : O(NlogN) , 하지만 최악의 경우 시간 복잡도는 O(N^2)이다. 하지만 파이썬은 기본 정렬 라이브러리(sorted)를 이용하면 O(NlogN)을 보장해준다.

    반응형

    'Study Platform📚 > (알고리즘)- [이코테] 이것이 코딩테스트다 정리' 카테고리의 다른 글

    [이코테]CHAPTER 05 DFS/BFS - 스택, 큐, 재귀함수, DFS  (0) 2022.05.17
    [이코테] CHAPTER 06 정렬 - 계수 정렬  (0) 2022.05.16
    [이코테] CHAPTER 07 이진탐색- 순차 탐색, 이분탐색/이진탐색, 이진탐색트리  (0) 2022.05.13
    [이코테] CHAPTER 03 그리디(Greedy)  (0) 2022.05.11
    [이코테] CHAPTER 06 정렬- 선택정렬,삽입정렬- 파이썬(Python), 자바(Java)  (0) 2022.04.26

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • [이코테]CHAPTER 05 DFS/BFS - 스택, 큐, 재귀함수, DFS

      [이코테]CHAPTER 05 DFS/BFS - 스택, 큐, 재귀함수, DFS

      2022.05.17
    • [이코테] CHAPTER 06 정렬 - 계수 정렬

      [이코테] CHAPTER 06 정렬 - 계수 정렬

      2022.05.16
    • [이코테] CHAPTER 07 이진탐색- 순차 탐색, 이분탐색/이진탐색, 이진탐색트리

      [이코테] CHAPTER 07 이진탐색- 순차 탐색, 이분탐색/이진탐색, 이진탐색트리

      2022.05.13
    • [이코테] CHAPTER 03 그리디(Greedy)

      [이코테] CHAPTER 03 그리디(Greedy)

      2022.05.11
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (169)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (5)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 백준
    • 99클럽
    • TiL
    • 오블완
    • 코딩테스트준비
    • 항해99
    • 티스토리챌린지
    • 프로그래머스

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바