[알고리즘] 퀵 정렬_원리

2022. 2. 9. 23:22·알고리즘/풀이 힌트
반응형

앞서 배운 선택 정렬 , 버블 정렬, 삽입정렬 알고리즘 모두 시간 복잡도 O(N ^ 2)를 가지는 알고리즘이다.

이러한 알고리즘은 데이터의 갯수가 10만 개만 넘어가도 일반적인 상황에서는 매우 사용하기 어려운 알고리즘이다.

​

퀵 정렬 : 하나의 큰 문제를 두 개의 작은 문제로 분할하는 식으로 빠르게 정렬

-> 특정한 값을 기준으로 큰 숫자와 작은 숫자를 서로 교환한 뒤 배열을 반으로 나눈다.

​

퀵 정렬은 특정한 기준 값이 있는데 이를 피벗이라고 하며 피벗값을 기준으로 왼쪽과 오른쪽으로 나눈다.

퀵 정렬의 예

3 7 8 1 5 9 6 10 2 4

피벗 값(일반적으로 가장 앞에있는 값) : 3

3 2 8 1 5 9 6 10 7 4 <= 3부터 -> 검색했을 때 3보다 큰 7과 <- 검색했을 때 3보다 작은 2의 위치를 바꿈

3 2 1 8 5 9 6 10 7 4 <= 위와 같이 검색해서 8과 1의 위치를 바꿈

1 2 ​3​ 8 5 9 6 10 7 4 <= 위와 같이 검색했을 때 3보다 작은 1과 3보다 큰 8이 서로 인덱스가 엇갈렸을 때 3과 1의 위치를 바꿈

1 2 3 8 5 9 6 10 7 4 <= 1을 기준으로 다시 위와 같이 검색을 했을 때 1보다 작은 값이 없기때문에 1의 위치는 정해졌다.

1 2 3 8 5 9 6 10 7 4 <= 2를 기준으로 다시 검색해도 1외엔 없기 떄문에 위치가 정해졌다.

1 2 3 8 5 4 6 10 7 9 <= 8을 기준으로 검색하여 4와 9의 위치를 바꾸어 주었다.

1 2 3 8 5 4 6 7 10 9 <= 8을 기준으로 다시 검색해 10과 7의 위치를 바꾸어 주었다.

1 2 3 7 5 4 6 8 10 9 <= 8을 기준으로 다시 검색하였을 때 7과 10의 인덱스가 엇갈렸기 때문에 8과 7의 위치를 바꾸어준다.

이러한 방법으로 값을 정렬한다.

​

선택 정렬, 버블 정렬, 삽입 정렬로 1 2 3 4 5 6 7 8 9 10 정렬 시 -> N ^ 2 = 10 * 10 = 100

퀵 정렬로 정렬 시 1 2 3 4 5 => 5 * 5 = 25 => 25 + 25 = 50 -> 반으로 쪼갠다는 말은 2씩 계속해서 나눠 계산을 한다고 하여

6 7 8 9 10 => 5 * 5 = 25 N * logN

​

대표적으로 '분할 정복' 알고리즘으로 평균 속도가 O(N * log2N)입니다.

 

삽입 정렬의 시간 복잡도

O(N * logN)

 

※ log2N -> N이 1,000,000일 때 ? N : 20

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 풀이 힌트' 카테고리의 다른 글

[알고리즘] C++ STL sort() 함수_class  (0) 2022.02.10
[알고리즘] 퀵 정렬_구현  (0) 2022.02.09
[알고리즘] 삽입 정렬  (0) 2022.02.09
[알고리즘] 버블정렬  (0) 2022.02.09
[알고리즘] 병합 정렬  (0) 2022.02.09
'알고리즘/풀이 힌트' 카테고리의 다른 글
  • [알고리즘] C++ STL sort() 함수_class
  • [알고리즘] 퀵 정렬_구현
  • [알고리즘] 삽입 정렬
  • [알고리즘] 버블정렬
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    네트워크
    리액트
    타일러영어
    타입스크립트
    네이버 부스트캠프
    ChatGPT
    Docker
    redux
    리얼클래스
    바질
    next.js
    바질 키우기
    프로그래머스
    typescript
    CCNA
    영어독학
    식물
    다이소
    자바스크립트
    webpack
    영어회화
    javascript
    ReactNative
    Node.js
    CSS
    Babel
    알고리즘
    리얼학습일기
    react
    덤프
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 퀵 정렬_원리
상단으로

티스토리툴바