22 May 2020
stl 보다 10배빠른 merge sort
Merge sort
개요
-
시간복잡도 : O(N*logN);
-
병합정렬은 분할정복을 이용하며 계속 반으로 쪼개다가 1개만 남았을때 다시 합치는데 이때 오름차순이라면 작은게 먼저 버퍼에 들어가게 되며 구간의 병합이 끝났을때 버퍼에 있던 데이터를 원래의 데이터로 옮긴다.
int bufSize=10000// 정렬하고자하는 데이터의 크기에 맞춰 설정
int buf[bufSize];
void merge(int* p,int len){
if(len<2)return;
int i,j,k,mid;
mid=len/2;
i=0,j=mid,k=0;
//분할
merge(p,mid);
merge(p+mid,len-mid);
//병합
while(i<mid&&j<len){
if(p[i]<p[j]){
buf[k++]=p[i++];
}else{
buf[k++]=p[j++];
}
}
while(i<mid){
buf[k++]=p[i++];
}
while(j<len){
buf[k++]=p[j++];
}
//정렬된 버퍼의 데이터를 원본에 옮겨준다.
for(int i=0;i<len;i++){
p[i]=buf[i];
}
}
int main(){
int arr[5] = { 5,2,3,1,4 };
for(int i=0;i<5;i++){
cout<<arr[i]<<'\n';
}
}
결과값