카테고리 없음
퀵정렬
by useSword
2024. 3. 11.
특정한 값을 기준으로 큰 숫자와 작은 숫자를 나누면 어떨까?
<작동방식>
- 리스트에서 임의의 원소를 피벗으로 선택합니다.
- 피벗보다 작은 원소들은 피벗 왼쪽에, 피벗보다 큰 원소들은 피벗 오른쪽에 위치시킵니다.
- 피벗 왼쪽과 오른쪽 부분을 각각 재귀적으로 퀵 정렬을 사용하여 정렬합니다.
<예시>
p
3 7 8 1 5 9 6 10 2 4 //3을 피벗으로 선택함
p v v
3 7 8 1 5 9 6 10 2 4 //전체적으로 보았을 때 왼쪽부터 시작하여 '3'보다 큰 값인 7을 선택.
//오른쪽으로 시작하였을 떄 '3'보다 작은 2를 선택.
p v v
3 2 8 1 5 9 6 10 7 4 //큰 값과 작은 값을 변경합니다.
//왼쪽에서 '3'보다 큰 값 8과 오른쪽에서 '3'보다 작은 값인 1을 선택.
p
v v
3 2 1 8 5 9 6 10 7 4 //큰 값과 작은 값을 변경합니다.
//왼쪽에서 '3'보다 큰 값 8과 오른쪽에서 '3'보다 작은 값인 1을 선택.
//위와 동일하지만 문제점은 엇갈렸다. 엇갈렸을 때 피벗값과 작은값의 인덱스를 변경
//엇갈림 : 작은 값의 인덱스가 큰값의 인덱스보다 더 작은것
1 2 3 8 5 9 6 10 7 4 //이를 통해 3은 정렬이 되었다.
//3보다 왼쪽은 3보다 작음. 3보다 오른쪽은 3보다 큼.
//이제 왼쪽 집합과 오른쪽 집합에서 그동안 한 일을 반복하면됨.
p v
1 2 //왼쪽부터 '1'보다 큰 2를 선택. 오른쪽부터 작은 값을 찾음.
//없기 때문에 자신을 선택하고 엇갈림이 생김. 피벗인 1과 작은 값 1을 바꿈. 결국 그대로임.
p v v
8 5 9 6 10 7 4 //왼쪽에서 8보다 큰 9와 오른쪽에서 8보다 작은 4를 선택
p v v
8 5 4 6 10 7 9 //9,4를 변경함.
//왼쪽에서 8보다 큰 10과 오른쪽에서 8보다 작은 7를 선택
p
8 5 4 6 7 10 9 //10,7를 변경함.
//왼쪽에서 8보다 큰 10과 오른쪽에서 8보다 작은 7를 선택. 엇갈림.
//엇갈림으로 인해 8과 작은값인 7과 자리를 변경함.
p
7 5 4 6 8 10 9 //8를 기준으로 왼쪽은 작은 값들이 있고 오른쪽에는 큰 값이 있음.
//다시 반복함.