퀵 정렬은 불안정 정렬에 속하며, 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다.
퀵 정렬(Quick Sort) 알고리즘의 특징
특정한 값을 기준으로 큰 숫자와 작은 숫자를 서로 교환한 뒤에 배열을 반으로 나눈다.
퀵 정렬에는 ‘기준 값’이 있는데 이를 피벗(pivot) 이라고도 한다.
퀵 정렬은 이미 정렬이 되어 있는 경우 시간복잡도는 O(N^2)에 가깝다.
그러나, 삽입 정렬의 경우 빠르게 해결 가능하다.
퀵 정렬(Quick Sort)의 알고리즘 예시
Source Code
#include<stdio.h>intnum=10;intdata[10]={1,10,5,8,7,6,4,3,2,9};// start : 부분집합의 첫번째 원소// end : 부분집합의 마지막 원소voidquickSort(int*data,intstart,intend){if(start>=end){// 원소가 한개인 경우 return;}intkey=start;// 첫 번째 원소(pivot) inti=start+1;// 원소 출발지점 왼쪽 -> 오른쪽 intj=end;// 원소 출발지점 오른쪽 -> 왼쪽inttmp;while(i<=j){// pivot 값 기준으로 찾은 큰 값과 작은 값이 엇갈린 경우까지 반복 while(data[i]>=data[key]){// pivot 값 보다 큰 값을 만날때까지 i++;}while(data[j]<=data[key]&&j>start){// pivot 값 보다 작은 값을 만날 때까지 && pivot 값 보다 크지 않아야한다. j--;}if(i>j){// 엇갈린 경우에 키 값과 교체한다. tmp=data[j];data[j]=data[key];data[key]=tmp;}else{// 엇갈리지 않았다면 큰 값과 작은 값을 교체한다. tmp=data[j];data[j]=data[i];data[i]=tmp;}}quickSort(data,start,j-1);quickSort(data,j+1,end);}intmain(){quickSort(data,0,num-1);for(inti=0;i<num;i++){printf("%d ",data[i]);}return0;}