SlideShare a Scribd company logo
1 of 27
Download to read offline
Introduction
가장 유명한 정렬 알고리즘 중 하나로 상당히 빠른 알고리즘이다
최악의 경우 𝑂(𝑛2)의 시간 복잡도를 가진다
하지만 평균적으로 𝑂(𝑛 log2 𝑛)번의 연산 안에 종료된다
Quick Sort Algorithm
아래의 배열을 Quick Sort 알고리즘을 사용해 정렬해보자
5 4 9 4 2 6 1 7
Quick Sort Algorithm
Step1> 배열의 원소 중 임의의 값 𝑝(노란배경)를 선택한다
5 4 9 4 2 6 1 7Step 1
Quick Sort Algorithm
Step2> 선택된 𝑝를 기준으로 더 작은 값은 왼쪽으로, 더 큰 값은 오른쪽으로
모두 옮긴다
2 4 4 1 5 6 9 7Step 2
Quick Sort Algorithm
Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다
5
6 9 72 4 4 1
Step 3
Quick Sort Algorithm
Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다
5
6 9 72 4 4 1Step 1
Step 3
Quick Sort Algorithm
Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다
5
6 7 92 1 4 4Step 2
Step 3
Quick Sort Algorithm
원소가 하나 뿐인 배열은 더 이상 수행하지 않는다
5
7
1
Step 3 4
4 6 9
Step 3
2Step 1
Quick Sort Algorithm
원소가 하나 뿐인 배열은 더 이상 수행하지 않는다
5
7
2
Step 3 4
4 6 9
Step 3
1Step 2
Quick Sort Algorithm
원소가 하나 뿐인 배열은 더 이상 수행하지 않는다
5
7
2
Step 3 4
4 6 9
Step 3
1
Step 3
Quick Sort Algorithm
모든 값이 피벗으로 선정된 적이 있으면 정렬은 종료된다
5
7
2
Step 3 4
4 6 9
Step 3
1
Step 3
Quick Sort Algorithm
결과적으로 모든 값들이 한번 씩 피벗으로 선정되며 자신의 자리를 찾아간다
5 72 4 4 6 91
Quick Sort Algorithm
아래의 그림과 같이 피벗은 실제 정렬 후 결과에서 자신이 있게 될 위치를
확정할 수 있다
2 4 4 1 5 6 9 7
자기보다 작은 원소의 수 자기보다 큰 원소의 수
정렬 후 배열에서의 위치는 자기보다 작은 원소들의 뒤 이기 때문이다
Implementation Overview
Quick Sort는 재귀함수를 사용하여 구현할 수 있다
1. 정렬할 배열의 피벗 𝑝를 설정한다
2. 배열을 𝑝를 기준으로 상대적으로 작은 값과 큰 값으로 분할한다
3. 이 과정을 배열이 한 칸이 될 때 까지 반복한다
Implementation – Array Partitioning
분할할 영역의 양 쪽 인덱스를 변수 𝑖, 𝑗로 설정합니다
5 4 9 4 2 6 1 7
𝑖 𝑗
𝐿 𝑅
Implementation – Array Partitioning
배열의 𝑖번째 값이 𝑝보다 작은 동안 𝑖를 증가시킨다
배열의 𝑗번째 값이 𝑝보다 큰 동안 𝑗를 감소시킨다
5 4 9 4 2 6 1 7
𝑖 𝑗
5 4 9 4 2 6 1 7
𝑖 𝑗
𝐿 𝑅
𝐿 𝑅
Implementation – Array Partitioning
더 이상 𝑖와 𝑗를 움직일 수 없을 때 멈춘다
그리고 𝑖번째 값과 𝑗번째 값의 자리를 바꾼다
𝑖를 1증가 시키고, 𝑗를 1감소 시킨다
5 4 9 4 2 6 1 7
𝑖 𝑗
1 4 9 4 2 6 5 7
𝑖 𝑗
𝐿 𝑅
𝐿 𝑅
Implementation – Array Partitioning
앞의 단계들을 반복하면 결과적으로 피벗을 기준으로
[𝐿, 𝑗]와 [𝑖, 𝑅]의 두 영역으로 배열이 분할된다
𝑖𝑗
𝐿 𝑅
2 4 4 1 5 6 9 7
2 4 4 1 6 9 7
𝑗𝐿 𝑖 𝑅
두 영역으로 나누는 연산은 𝑂(𝑛)이 연산량을 가진다
Implementation – Recursive Function
다음의 코드와 같이 구현할 수 있다
𝑖𝑗
𝐿 𝑅
2 4 4 1 5 6 9 7
2 4 4 1 6 9 7
𝑗𝐿 𝑖 𝑅
5 4 9 4 2 6 1 7
𝑖 𝑗
𝐿 𝑅
Choosing a Pivot
퀵 정렬은 피벗 𝑝를 설정하는 다양한 방법이 존재한다
입력 배열의 형태와 피벗을 선택하는 방법에 따라 성능에 차이가 존재한다
1. 배열의 가장 왼쪽 값을 피벗으로 설정하기
2. 배열의 중간에 있는 값을 피벗으로 설정하기
3. 랜덤으로 배열의 아무 숫자나 피벗으로 설정하기
…
Choosing a Pivot
다음과 같은 입력 배열에 대하여
각 피벗 선정 방식에 따른 차이를 상상해보자
1. 배열의 가장 왼쪽 값을 피벗으로 설정하기
2. 배열의 중간에 있는 값을 피벗으로 설정하기
3. 랜덤으로 배열의 아무 숫자나 피벗으로 설정하기
…
8 7 6 5 4 3 2 1
Worst Case
아래의 배열을 가장 왼쪽 값을 피벗으로 하여 오름차순 정렬해보자
…
1 2 3 … … n-2 n-1 n
1 2 3 … … n-2 n-1 n
1 2 3 … … n-2 n-1 n
1 2 3 … … n-2 n-1 n
1 2 3 … … n-2 n-1 n
1 2 3 … … n-2 n-1 n
𝑛
𝑛 − 1
𝑛 − 2
𝑛 − 3
2
1
0
Worst Case
즉, 퀵 정렬은 최악의 경우 𝑂(𝑛2
)의 연산량을 가지게 된다
그럼에도 통계적으로 퀵 정렬은 매우 빠른 속도를 나타낸다
최적의 경우는 항상 피벗을 배열의 중앙값으로 선정하는 것이다
다음 번 배열의 크기가 점점 약 절반으로 줄어가기 때문이다
Worst Case
피벗이 대상 배열의 중앙값에 가까울수록 전체 연산량이 줄어든다
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
How to choose a pivot
다음의 방법이 가장 유명한 방법으로 알려져 있다
𝑝 = 𝑆𝑒𝑐𝑜𝑛𝑑( 𝑎𝑟𝑟 𝑙𝑒𝑓𝑡 , 𝑎𝑟𝑟 𝑟𝑖𝑔ℎ𝑡 , 𝑎𝑟𝑟[
𝑙𝑒𝑓𝑡+𝑟𝑖𝑔ℎ𝑡
2
])
정렬할 배열의 왼쪽 끝, 오른쪽 끝 그리고 중앙에서 고른 값들 중 중위값
5 4 9 4 2 6 1 7
4 5 7
Thank you
감사합니다 

More Related Content

Similar to 퀵 정렬 알고리즘 기초

Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagationJinSooKim80
 
[Algorithm] Quick Sort
[Algorithm] Quick Sort[Algorithm] Quick Sort
[Algorithm] Quick SortBill Kim
 
Shell, merge, heap sort
Shell, merge, heap sortShell, merge, heap sort
Shell, merge, heap sortHyun Jin Moon
 
[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디대영 노
 
Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리SANG WON PARK
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection SortBill Kim
 
Lecture 3: Unsupervised Learning
Lecture 3: Unsupervised LearningLecture 3: Unsupervised Learning
Lecture 3: Unsupervised LearningSang Jun Lee
 
알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdols알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdolsseungdols
 
알파고 해부하기 3부
알파고 해부하기 3부알파고 해부하기 3부
알파고 해부하기 3부Donghun Lee
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)Jeonghun Yoon
 
Auto-Encoders and Variational Auto-Encoders
Auto-Encoders and Variational Auto-EncodersAuto-Encoders and Variational Auto-Encoders
Auto-Encoders and Variational Auto-EncodersJinho Lee
 
Alexnet paper review
Alexnet paper reviewAlexnet paper review
Alexnet paper review오 혜린
 
딥러닝 기본 원리의 이해
딥러닝 기본 원리의 이해딥러닝 기본 원리의 이해
딥러닝 기본 원리의 이해Hee Won Park
 
정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석Young-jun Jeong
 

Similar to 퀵 정렬 알고리즘 기초 (20)

Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagation
 
[Algorithm] Quick Sort
[Algorithm] Quick Sort[Algorithm] Quick Sort
[Algorithm] Quick Sort
 
Shell, merge, heap sort
Shell, merge, heap sortShell, merge, heap sort
Shell, merge, heap sort
 
[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디
 
알고리즘
알고리즘알고리즘
알고리즘
 
알고리즘
알고리즘알고리즘
알고리즘
 
DL from scratch(6)
DL from scratch(6)DL from scratch(6)
DL from scratch(6)
 
06. sorting
06. sorting06. sorting
06. sorting
 
6. Sorting
6. Sorting6. Sorting
6. Sorting
 
Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리Coursera Machine Learning (by Andrew Ng)_강의정리
Coursera Machine Learning (by Andrew Ng)_강의정리
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection Sort
 
Lecture 3: Unsupervised Learning
Lecture 3: Unsupervised LearningLecture 3: Unsupervised Learning
Lecture 3: Unsupervised Learning
 
알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdols알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdols
 
알파고 해부하기 3부
알파고 해부하기 3부알파고 해부하기 3부
알파고 해부하기 3부
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)
 
Auto-Encoders and Variational Auto-Encoders
Auto-Encoders and Variational Auto-EncodersAuto-Encoders and Variational Auto-Encoders
Auto-Encoders and Variational Auto-Encoders
 
Alexnet paper review
Alexnet paper reviewAlexnet paper review
Alexnet paper review
 
딥러닝 기본 원리의 이해
딥러닝 기본 원리의 이해딥러닝 기본 원리의 이해
딥러닝 기본 원리의 이해
 
정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석정렬 알고리즘의 성능 분석
정렬 알고리즘의 성능 분석
 
Semina tree
Semina   treeSemina   tree
Semina tree
 

Recently uploaded

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 

Recently uploaded (6)

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 

퀵 정렬 알고리즘 기초

  • 1.
  • 2. Introduction 가장 유명한 정렬 알고리즘 중 하나로 상당히 빠른 알고리즘이다 최악의 경우 𝑂(𝑛2)의 시간 복잡도를 가진다 하지만 평균적으로 𝑂(𝑛 log2 𝑛)번의 연산 안에 종료된다
  • 3. Quick Sort Algorithm 아래의 배열을 Quick Sort 알고리즘을 사용해 정렬해보자 5 4 9 4 2 6 1 7
  • 4. Quick Sort Algorithm Step1> 배열의 원소 중 임의의 값 𝑝(노란배경)를 선택한다 5 4 9 4 2 6 1 7Step 1
  • 5. Quick Sort Algorithm Step2> 선택된 𝑝를 기준으로 더 작은 값은 왼쪽으로, 더 큰 값은 오른쪽으로 모두 옮긴다 2 4 4 1 5 6 9 7Step 2
  • 6. Quick Sort Algorithm Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다 5 6 9 72 4 4 1 Step 3
  • 7. Quick Sort Algorithm Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다 5 6 9 72 4 4 1Step 1 Step 3
  • 8. Quick Sort Algorithm Step3> 𝑝를 기준으로 좌우 부분 배열에 대해서 1단계부터 다시 수행한다 5 6 7 92 1 4 4Step 2 Step 3
  • 9. Quick Sort Algorithm 원소가 하나 뿐인 배열은 더 이상 수행하지 않는다 5 7 1 Step 3 4 4 6 9 Step 3 2Step 1
  • 10. Quick Sort Algorithm 원소가 하나 뿐인 배열은 더 이상 수행하지 않는다 5 7 2 Step 3 4 4 6 9 Step 3 1Step 2
  • 11. Quick Sort Algorithm 원소가 하나 뿐인 배열은 더 이상 수행하지 않는다 5 7 2 Step 3 4 4 6 9 Step 3 1 Step 3
  • 12. Quick Sort Algorithm 모든 값이 피벗으로 선정된 적이 있으면 정렬은 종료된다 5 7 2 Step 3 4 4 6 9 Step 3 1 Step 3
  • 13. Quick Sort Algorithm 결과적으로 모든 값들이 한번 씩 피벗으로 선정되며 자신의 자리를 찾아간다 5 72 4 4 6 91
  • 14. Quick Sort Algorithm 아래의 그림과 같이 피벗은 실제 정렬 후 결과에서 자신이 있게 될 위치를 확정할 수 있다 2 4 4 1 5 6 9 7 자기보다 작은 원소의 수 자기보다 큰 원소의 수 정렬 후 배열에서의 위치는 자기보다 작은 원소들의 뒤 이기 때문이다
  • 15. Implementation Overview Quick Sort는 재귀함수를 사용하여 구현할 수 있다 1. 정렬할 배열의 피벗 𝑝를 설정한다 2. 배열을 𝑝를 기준으로 상대적으로 작은 값과 큰 값으로 분할한다 3. 이 과정을 배열이 한 칸이 될 때 까지 반복한다
  • 16. Implementation – Array Partitioning 분할할 영역의 양 쪽 인덱스를 변수 𝑖, 𝑗로 설정합니다 5 4 9 4 2 6 1 7 𝑖 𝑗 𝐿 𝑅
  • 17. Implementation – Array Partitioning 배열의 𝑖번째 값이 𝑝보다 작은 동안 𝑖를 증가시킨다 배열의 𝑗번째 값이 𝑝보다 큰 동안 𝑗를 감소시킨다 5 4 9 4 2 6 1 7 𝑖 𝑗 5 4 9 4 2 6 1 7 𝑖 𝑗 𝐿 𝑅 𝐿 𝑅
  • 18. Implementation – Array Partitioning 더 이상 𝑖와 𝑗를 움직일 수 없을 때 멈춘다 그리고 𝑖번째 값과 𝑗번째 값의 자리를 바꾼다 𝑖를 1증가 시키고, 𝑗를 1감소 시킨다 5 4 9 4 2 6 1 7 𝑖 𝑗 1 4 9 4 2 6 5 7 𝑖 𝑗 𝐿 𝑅 𝐿 𝑅
  • 19. Implementation – Array Partitioning 앞의 단계들을 반복하면 결과적으로 피벗을 기준으로 [𝐿, 𝑗]와 [𝑖, 𝑅]의 두 영역으로 배열이 분할된다 𝑖𝑗 𝐿 𝑅 2 4 4 1 5 6 9 7 2 4 4 1 6 9 7 𝑗𝐿 𝑖 𝑅 두 영역으로 나누는 연산은 𝑂(𝑛)이 연산량을 가진다
  • 20. Implementation – Recursive Function 다음의 코드와 같이 구현할 수 있다 𝑖𝑗 𝐿 𝑅 2 4 4 1 5 6 9 7 2 4 4 1 6 9 7 𝑗𝐿 𝑖 𝑅 5 4 9 4 2 6 1 7 𝑖 𝑗 𝐿 𝑅
  • 21. Choosing a Pivot 퀵 정렬은 피벗 𝑝를 설정하는 다양한 방법이 존재한다 입력 배열의 형태와 피벗을 선택하는 방법에 따라 성능에 차이가 존재한다 1. 배열의 가장 왼쪽 값을 피벗으로 설정하기 2. 배열의 중간에 있는 값을 피벗으로 설정하기 3. 랜덤으로 배열의 아무 숫자나 피벗으로 설정하기 …
  • 22. Choosing a Pivot 다음과 같은 입력 배열에 대하여 각 피벗 선정 방식에 따른 차이를 상상해보자 1. 배열의 가장 왼쪽 값을 피벗으로 설정하기 2. 배열의 중간에 있는 값을 피벗으로 설정하기 3. 랜덤으로 배열의 아무 숫자나 피벗으로 설정하기 … 8 7 6 5 4 3 2 1
  • 23. Worst Case 아래의 배열을 가장 왼쪽 값을 피벗으로 하여 오름차순 정렬해보자 … 1 2 3 … … n-2 n-1 n 1 2 3 … … n-2 n-1 n 1 2 3 … … n-2 n-1 n 1 2 3 … … n-2 n-1 n 1 2 3 … … n-2 n-1 n 1 2 3 … … n-2 n-1 n 𝑛 𝑛 − 1 𝑛 − 2 𝑛 − 3 2 1 0
  • 24. Worst Case 즉, 퀵 정렬은 최악의 경우 𝑂(𝑛2 )의 연산량을 가지게 된다 그럼에도 통계적으로 퀵 정렬은 매우 빠른 속도를 나타낸다 최적의 경우는 항상 피벗을 배열의 중앙값으로 선정하는 것이다 다음 번 배열의 크기가 점점 약 절반으로 줄어가기 때문이다
  • 25. Worst Case 피벗이 대상 배열의 중앙값에 가까울수록 전체 연산량이 줄어든다 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1
  • 26. How to choose a pivot 다음의 방법이 가장 유명한 방법으로 알려져 있다 𝑝 = 𝑆𝑒𝑐𝑜𝑛𝑑( 𝑎𝑟𝑟 𝑙𝑒𝑓𝑡 , 𝑎𝑟𝑟 𝑟𝑖𝑔ℎ𝑡 , 𝑎𝑟𝑟[ 𝑙𝑒𝑓𝑡+𝑟𝑖𝑔ℎ𝑡 2 ]) 정렬할 배열의 왼쪽 끝, 오른쪽 끝 그리고 중앙에서 고른 값들 중 중위값 5 4 9 4 2 6 1 7 4 5 7