int partition(record arr[], int low, int high) {
char* pivot = arr[high].name;
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (strcmp(arr[j].name, pivot) < 0) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
우리는 pivot을 배열의 맨 끝 요소로 둘 것이다. 그리고 pivot보다 큰 값은 pivot의 오른편에, pivot보다 작은 값은 pivot의 왼편에 배치해야 한다. 그래서 i=low-1이라는 변수를 두고, pivot보다 작은 값이 나올 때마다 i를 점진적으로 ++시키며 맨 앞자리로 옮겨 주었다.
마지막에는 pivot 값도 알맞은 곳(i+1번째)에 배치해 준 후, 해당 index를 반환값으로 돌려준다.
void quickSort(record arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
반환값으로 받은 index를 기준으로 다시 두 번의 quickSort 함수 호출을 수행한다. 이러한 과정이 반복되는 재귀 호출 덕분에 우리는 결론적으로 모든 파티션을 순회할 수 있고, 따라서 모든 요소를 돌아 올바른 정렬이 수행된다.
+ swap 함수
void swap(record* a, record* b) {
record temp = *a;
*a = *b;
*b = temp;
}
'자료구조' 카테고리의 다른 글
[자료구조] BT level order traversal 문제 풀이 (Queue 사용) (1) | 2024.06.14 |
---|---|
[자료구조] 인접 행렬과 인접 리스트(adjacency list) 문제 풀이 3 (1) | 2024.06.14 |
[자료구조] inserting sort 문제 REVIEW (1) | 2024.06.12 |
[자료구조] BST delete 함수 작성해보기 (2) | 2024.06.10 |
[자료구조] BST insert, inorder traversal 문제 REVIEW (2) | 2024.06.10 |