-
합병정렬(MergeSort)_(1)예전 글들/C, C++ 2010. 12. 24. 14:54반응형
1. 합병정렬
- 문제: n개 키를 비내림차순으로 정렬
- 입력: 양의 정수 n, 키의 배열 S(첨자는 1부터 n까지)
- 출력: 키가 비내림차순으로 정렬된 배열 S
2. 합병
- 문제: 2개의 정렬된 배열을 하나의 정렬된 배열로 합병
- 입력: 양의 정수 h와 m, 정렬된 키의 배열 U(첨자는 1부터 h까지), 정렬된 키의 배열 V(첨자는 1부터 m까지)
- 출력: U와 Ω의 키들을 모두 포함하여 정렬한 배열 S(첨자는 1부터 h+m까지)
3. 소스
void merge(int h, int m, int* U, int* V, int* s);
void mergesort(int n, int* s, int step);int main(int argc, char* argv[])
{
int s[] = {27, 10, 12, 20, 25, 13, 15, 22};
int count=0;
int step=0;count = sizeof(s)/sizeof(int)-1;
mergesort(count, s, step);
for( int i=0 ; i<count-1 ; i++ )
cout << s[i] << endl;return 0;
}void merge(int h, int m, int* U, int* V, int* s)
{
int i, j, k;i=0; j=0; k=0;
while( i<=h && j<=m )
{
if( U[i] < V[j] )
{
s[k] = U[i];
i++;
}
else
{
s[k] = V[j];
j++;
}
k++;
}if( i>h )
{
for( int tmp=0 ; tmp<(m-j) ; tmp++ )
s[k+tmp] = V[tmp+j];
}
else
{
for( int tmp=0 ; tmp<(h-i) ; tmp++)
s[k+tmp] = U[i+tmp];
}
}void mergesort(int n, int* s, int step)
{
const int h = n/2;
const int m = n-h;/*h = (int)(n / 2);
m = (int)(n - h);*/int U[h]; // 왜 이거 에러뜰까? 동적으로 할당도 해봤는데 gcc로는 되는데 비주얼에서는 안된다. -_-+
int V[m]; // error C2057: 상수 식이 필요합니다. / error C2466: 상수 크기 0의 배열을 할당할 수 없습니다.
// error C2133: 'U' : 알 수 없는 크기입니다.int step1 = 0;
cout << "Step : " << step << endl;
if( n>1 )
{
for( int i=0 ; i<h ; i++ )
{
U[i] = s[i];
}
for( int i=h+1, j=0 ; i<n ; i++, j++ )
{
V[j] = s[i];
}
step1 = step + 1;
mergesort(h, U, step1);
step1 = step + 1;
mergesort(m, V, step1);
merge(h, m, U, V, s);
}
}반응형'예전 글들 > C, C++' 카테고리의 다른 글
객체 지향 프로그래밍 (0) 2011.02.11 C언어, C++ 이란 무엇인가 (0) 2011.02.11 이분검색(Binary Search) (0) 2010.12.23 내가 못외우는 것들 중에 하나..sizeof()로 구한 데이터 타입별 크기 (0) 2010.12.23 [C++] 이런것도 되는군요 *this (0) 2010.09.24 댓글