https://www.youtube.com/watch?v=EuJSDghD4z8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=23https://www.youtube.com/watch?v=EuJSDghD4z8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=23

 23강 퀵 정렬-0
 23강 퀵 정렬-1
 23강 퀵 정렬-2
 23강 퀵 정렬-3

작은 데이터의 위치를 서로

 23강 퀵 정렬-5

정열 알고리즘중 하나라고 볼수 있구요

 23강 퀵 정렬-7
 23강 퀵 정렬-8

모두 퀵정렬 혹은 병합정렬의

알고리즘을 사용하고 있는데요

 23강 퀵 정렬-11
 23강 퀵 정렬-12

그 퀵정렬의 대해서

퀵정렬은 정렬을 수행하는 과정에서 기준데이터 즉 피벗값을

 23강 퀵 정렬-15

퀵정렬은

 23강 퀵 정렬-17
 23강 퀵 정렬-18

 23강 퀵 정렬-20

 23강 퀵 정렬-22

피벗으로 설정해서 정렬을 수행하는데요

 23강 퀵 정렬-24

현재 피벗의 값은 5입니다

작은 데이터를 고릅니다 그래서 이와같이

 23강 퀵 정렬-27

큰 값인 7

 23강 퀵 정렬-29

이 5보다 작은 값인 4가

 23강 퀵 정렬-31
 23강 퀵 정렬-32

9와 2가 선택됩니다

 23강 퀵 정렬-34

이 9와 2또한 서로 위치를 바꿔줍니다 그럼 이처럼 다시한번 이어서

이 왼쪽에서부터 찾아서 6을 고를수 있구요

 23강 퀵 정렬-38

이 1을 고를수있습니다

 23강 퀵 정렬-40

다만 이때는

위치가 서로 엇갈렸을때는

 23강 퀵 정렬-44
 23강 퀵 정렬-45

 23강 퀵 정렬-47
 23강 퀵 정렬-48
 23강 퀵 정렬-49

이 피벗값을 왼쪽에

 23강 퀵 정렬-51
 23강 퀵 정렬-52

다시한번 퀵정렬을 수행해주고

오른쪽에 데이터데 대해서도 마찬가지로 퀵정렬을 수행해 줍니다

 23강 퀵 정렬-55

퀵정렬이 수행되는 과정은 재귀적으로 수행되구요 수행될때마다

 23강 퀵 정렬-57

정열을 수행하게 되면

 23강 퀵 정렬-59

오른쪽에서 부터는 피벗보다 작은걸

서로 바꾸어 주는 방식으로 동작하겠죠

 23강 퀵 정렬-62

이렇게 오른쪽 데이터 묶음에 대해서도 마찬가지로 다시 이렇게 퀵정렬이 수행 되는걸 확인할 수 있습니다

 23강 퀵 정렬-64
 23강 퀵 정렬-65
 23강 퀵 정렬-66

퀵정렬은 왜 빠르게

생각해 볼수 있습니다

 23강 퀵 정렬-69

한번 파티션

절반에 가깝게 분할 시킬수 있다면 전체 연산 횟수로 O(NlogN)을 기대할 수 있습니다

 23강 퀵 정렬-72
 23강 퀵 정렬-73

피벗값을 분할을 이루어진다고 봐야겠지만

데이터를 절반씩 묶어서

 23강 퀵 정렬-76

데이터의 범위가 절반씩

 23강 퀵 정렬-78

전체의 높이를 확인했을때 log N이라고 볼수 있습니다

밑이 2인 log N이라고 표현 할수가 있겠네요

 23강 퀵 정렬-81

데이터의 개수는 N이고

 23강 퀵 정렬-83

NlogN 에 비례하는 만큼 발생할 것을 기대할수 있습니다

 23강 퀵 정렬-85
 23강 퀵 정렬-86

퀵 정렬의 시간복잡도에

 23강 퀵 정렬-88

NlogN 시간 복잡도

증명 과정은 생략했습니다

담음은 퀵정렬의 특징이라고 한다면 최악의 경우 N제곱의 시간복잡도를 가질수 있음

 23강 퀵 정렬-92
 23강 퀵 정렬-93
 23강 퀵 정렬-94
 23강 퀵 정렬-95

즉 분할이 한쪽으로 편향될 경우 n제곱의 시간복잡도를 가지게 됨

평균적으로는 NlogN 시간 복잡도임

피벗으로

어떻게 될까요?

 23강 퀵 정렬-102
 23강 퀵 정렬-103

퀵 솔트를 수행하게 되면 이 첫번째 원소인 0을

 23강 퀵 정렬-105
 23강 퀵 정렬-106

 23강 퀵 정렬-108
 23강 퀵 정렬-109

다시 이 1을 피벗값으로 설정해서 퀵정렬을 수행하게되고

 23강 퀵 정렬-111

정리

최악의 경우 분할이 수행되는 횟수가 N과 비례하고

분할을 하기위해서 매번 선형탐생을 수행해야해서 전체 시간복잡도가 N 제곱이 되는 것임

 23강 퀵 정렬-116

선형탐색을 수행해야 되기 때문에

 23강 퀵 정렬-118

퀵정렬은 이렇게 단순하게 구현을 했을때

 23강 퀵 정렬-120
 23강 퀵 정렬-121

NlogN을 보장 할수 있는

 23강 퀵 정렬-123

피벗으로

퀵정렬을 n제곱이 나올수 있다느점 감안해 주시고요

 23강 퀵 정렬-126

NlogN 을 항상 보장한다는 점까지

정리

다양한 프로그래밍 언어에서 표준 정렬 라이브러리를 제공할때 이 퀵정렬 기반으로 라이브러리가 작성 되어 있으면 최악의 경우에도 NlogN을 보장 할수 있는 형태로 구현 가능함

 23강 퀵 정렬-133

자 그래서 이러한 퀵정렬을 파이썬으로 구현한건 다음과 같습니다

 23강 퀵 정렬-135

현재 정렬을 위한 데이터의 범위의 오직 하나의 데이터만 포함되어 있다면

즉 원소가 1개의 경우에는 종료할 수 있도록 만들어 주고요

 23강 퀵 정렬-138

정렬하고자 하는 데이터가

피벗 값으로 설정합니다

 23강 퀵 정렬-141

첫번째 원소를 제외하고 오른쪽 원소중에서

가장 오른쪽을 right로 설정하는걸 확인할 수 있습니다

 23강 퀵 정렬-144

가리키고 있는 그 인덱스 보다 이 right 가리키고 있는

 23강 퀵 정렬-146
 23강 퀵 정렬-147
 23강 퀵 정렬-148
 23강 퀵 정렬-149

즉 left는 항상 오른쪽으로 가고 right은 항상 왼쪽으로 가기때문에

이과정 자체를 선형 탐색이라고 볼 수 있겠죠

 23강 퀵 정렬-152

left 와 right 값을 확인해서

 23강 퀵 정렬-154

이후에는 이 right변수가 가리키는

때문에 이 array[right]과 array[pivot]의 위치를서로 바꿔주면 됩니다

 23강 퀵 정렬-157

작은데이터와 큰데이터의 위치를

 23강 퀵 정렬-159

정렬을 수행해서 퀵솔트를

 23강 퀵 정렬-161

균형있게 분할이 이루어져서

 23강 퀵 정렬-163

수 있습니다

 23강 퀵 정렬-165
 23강 퀵 정렬-166

퀵 쏠트

 23강 퀵 정렬-169
 23강 퀵 정렬-170

레프트 롸이트 값을

 23강 퀵 정렬-172

이어서 롸이트은 오른쪽에서

 23강 퀵 정렬-174
 23강 퀵 정렬-175

재귀적으로 호출 하는걸

 23강 퀵 정렬-177
 23강 퀵 정렬-178

로 설정한 뒤에

 23강 퀵 정렬-180

피벗보다 큰데이터

 23강 퀵 정렬-182

피벗의 위치를

 23강 퀵 정렬-184

데이터와 큰데이터의 위치를 바꿔주는걸 확인할 수 있습니다

 23강 퀵 정렬-186

호출 하는 것을

 23강 퀵 정렬-188
 23강 퀵 정렬-189

퀵정렬을

리스트 슬라이싱 과 리스트 컴프레션

 23강 퀵 정렬-193

퀵정렬의 로직을 활용해서

 23강 퀵 정렬-195

원소로

 23강 퀵 정렬-197
 23강 퀵 정렬-198
 23강 퀵 정렬-199

피벗을 제외한

피벗보다 값이 큰 이 오른쪽 위치에

 23강 퀵 정렬-202

퀵정렬을 수행한

 23강 퀵 정렬-204

수행한

 23강 퀵 정렬-206

이 전체 리스트는

 23강 퀵 정렬-208

분할을

Last Updated:

Summarize & share videos seamlessly

Loading...