-
[알고리즘] 퀵정렬 알고리즘a 2022. 3. 14. 20:54반응형
퀵정렬 알고리즘이란
분할 정복 알고리즘의 하나이다.
분할 정복 방법이란, 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략이다.
퀵 정렬은 문제를 2개의 부분문제로 분할할 때, 크기가 일정하지 않은 특징이 있다.
왜 부분문제의 크기가 다르냐면, 퀵 정렬을 할 때
피봇을 기준으로 피봇보다 큰 숫자는 오른편에, 작은 숫자는 왼편에 위치하도록 분할한 후에
피봇을 그 사이에 놓는다.
알고리즘)
quickSort(A, left, right) input: A[left] ~ A[right] output: 정렬된 A[left] ~ A[right] 1. if(left < right){ 2. 피봇이 되는 숫자를 정의한다. 3. 피봇을 배열의 원소와 비교한다. 4. 피봇보다 작은 숫자들은 A[left] ~ A[p-1]로 옮긴다. 피봇보다 큰 숫자들은 A[p+1] ~ A[right]로 옮긴다. 5. quickSort(A, left, p-1) //피봇보다 작은 그룹 6. quickSort(A, p+1, right)//피봇보다 큰 그룹
퀵정렬의 과정
1. 리스트 안에 있는 한 요소를 선택한다. 이 요소는 피봇이다.
2. 피봇보다 작은 요소는 피봇의 왼쪽으로 옮기고, 피봇보다 큰 요소는 피봇의 오른쪽으로 옮긴다.
3. 피봇을 제외한 왼쪽과 오른쪽 요소들을 정렬한다.
#include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 15 #define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t)) void makeList(int list[]) { for(int i = 0; i < SIZE; i++) list[i] =rand() % 100 + 1; } void printList(int list[]) { for(int i = 0; i < SIZE; i++) printf("%d ", list[i]); printf("\n"); } int partition(int list[], int left, int right) { int pivot, temp, low, high; pivot = list[left]; low = left; high = right + 1; do { do low++; while (list[low] < pivot); do high--; while (list[high] > pivot); /* for (int i = 0; i < SIZE; i++) printf("%d ", list[i]); printf("\nlow=%d, high=%d\n", low, high); */ if(low < high) SWAP(list[low], list[high], temp); } while (low < high); SWAP(list[left], list[high], temp); return high; } void quickSort(int list[], int left, int right) { if(left < right) { int q = partition(list, left, right); quickSort(list, left, q - 1); quickSort(list, q + 1, right); } } int main() { int list[SIZE]; srand(time(NULL)); makeList(list); printList(list); quickSort(list, 0, SIZE - 1); printList(list); }
https://spacebike.tistory.com/29
퀵 정렬 (Quick sort) 쉽게 알기
퀵 정렬(Quick sort) 퀵 정렬은 평균적으로 매우 빠른 속도를 자랑하는 정렬 방법입니다. 그렇기에 이름부터가 다소 건방진 '퀵' 정렬인데요. 보통 다른 정렬 방법들은 이름으로부터 어떻게 정렬을
spacebike.tistory.com
반응형'a' 카테고리의 다른 글
[알고리즘] 선택(Selection) 알고리즘 (0) 2022.03.16 [알고리즘] 합병 정렬(Merge Sort) (0) 2022.03.15 [cuda-samples] 컴파일 오류 목록 (0) 2022.03.14 [docker] container의 status를 up으로 유지하기 (0) 2022.03.10 [docker] -d 옵션과 attach (0) 2022.03.10