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
반응형