알고리즘 - 선택정렬
내장형 하드웨어/C언어 / 2011. 10. 26. 15:12
[선택 정렬법]
참고)
선택 정렬법(selection sort)은 가장 앞에 있는 데이터 A1부터 시작하여 모든 데이터 A2~An를 차례대로 비교하면서 그 위치에 놓여질 데이터를 결정한 후, 그 다음 데이터 A2로 이동하여 같은 방법을 적용한다.
처음 데이터 A1를 그 다음 번 째 데이터와 비교하여 오름차순일 때는 A1이 더 크면 맞바꾸고 내림차순일 때는 A1이 더 작으면 서로 맞바꾼다.
#include<stdio.h>
void SelectSort(unsigned int *A, unsigned int iNum, unsigned int flag);
int main()
{
unsigned int A[100]; // 숫자가 저장되는 배열
unsigned int iCnt; // 반복문을 위한 변수
unsigned int iNum; // 정렬 범위를 저장하는 변수
unsigned int flag; // 분기를 선택하는 변수
// 정렬할 숫자의 개수(범위)를 입력받는다.
printf("정렬할 숫자의 개수를 입력하세요: ");
scanf("%d", &iNum);
// 정렬 범위 만큼의 숫자를 입력받는다.
printf("%d개의 숫자를 입력하세요: ", iNum);
for(iCnt=0; iCnt<iNum;++iCnt)
{
scanf("%d", &A[iCnt]);
}
// 오름차순 or 내림차순 선택
printf("오름차순이면 1, 내림차순이면 2를 입력하세요: ");
scanf("%d", &flag);
// 선택에 따른 분기
if(flag==1)
{
// 오름차순
printf("\n- 오름차순일 경우 -\n");
SelectSort(A, iNum, flag);
}
else
{
// 내림차순
printf("\n- 내림차순일 경우 -\n");
SelectSort(A, iNum, flag);
}
return 0;
}
void SelectSort(unsigned int *A, unsigned int iNum, unsigned int flag)
{
int Temp; // 임시 저장 변수
unsigned int iCnt;
unsigned int iCnt2;
unsigned int iCheck = 0; // 계산 횟수를 저장한다.
// 정렬되기 전에 저장된 숫자를 출력한다.
for(iCnt=0;iCnt<iNum;++iCnt)
{
printf("%d, ", A[iCnt]);
}
printf("\n");
// 정렬을 시작한다.
for(iCnt2=0;iCnt2<(iNum-1);++iCnt2)
{
for(iCnt=iCnt2;iCnt<(iNum-1);++iCnt)
{
if(flag==1) // 오름차순일 경우
{
if(A[iCnt2] > A[iCnt+1])
{
Temp = A[iCnt2];
A[iCnt2] = A[iCnt+1];
A[iCnt+1] = Temp;
}
}
else // 내림 차순일 경우
{
if(A[iCnt2] < A[iCnt+1])
{
Temp = A[iCnt2];
A[iCnt2] = A[iCnt+1];
A[iCnt+1] = Temp;
}
}
++iCheck;
}
}
// 정렬된 결과를 출력한다.
for(iCnt=0;iCnt<iNum;++iCnt)
{
printf("%d ->", A[iCnt]);
}
// 총 계산 횟수를 출력한다.
printf("계산횟수 : %d\n", iCheck);
return ;
}
void SelectSort(unsigned int *A, unsigned int iNum, unsigned int flag);
int main()
{
unsigned int A[100]; // 숫자가 저장되는 배열
unsigned int iCnt; // 반복문을 위한 변수
unsigned int iNum; // 정렬 범위를 저장하는 변수
unsigned int flag; // 분기를 선택하는 변수
// 정렬할 숫자의 개수(범위)를 입력받는다.
printf("정렬할 숫자의 개수를 입력하세요: ");
scanf("%d", &iNum);
// 정렬 범위 만큼의 숫자를 입력받는다.
printf("%d개의 숫자를 입력하세요: ", iNum);
for(iCnt=0; iCnt<iNum;++iCnt)
{
scanf("%d", &A[iCnt]);
}
// 오름차순 or 내림차순 선택
printf("오름차순이면 1, 내림차순이면 2를 입력하세요: ");
scanf("%d", &flag);
// 선택에 따른 분기
if(flag==1)
{
// 오름차순
printf("\n- 오름차순일 경우 -\n");
SelectSort(A, iNum, flag);
}
else
{
// 내림차순
printf("\n- 내림차순일 경우 -\n");
SelectSort(A, iNum, flag);
}
return 0;
}
void SelectSort(unsigned int *A, unsigned int iNum, unsigned int flag)
{
int Temp; // 임시 저장 변수
unsigned int iCnt;
unsigned int iCnt2;
unsigned int iCheck = 0; // 계산 횟수를 저장한다.
// 정렬되기 전에 저장된 숫자를 출력한다.
for(iCnt=0;iCnt<iNum;++iCnt)
{
printf("%d, ", A[iCnt]);
}
printf("\n");
// 정렬을 시작한다.
for(iCnt2=0;iCnt2<(iNum-1);++iCnt2)
{
for(iCnt=iCnt2;iCnt<(iNum-1);++iCnt)
{
if(flag==1) // 오름차순일 경우
{
if(A[iCnt2] > A[iCnt+1])
{
Temp = A[iCnt2];
A[iCnt2] = A[iCnt+1];
A[iCnt+1] = Temp;
}
}
else // 내림 차순일 경우
{
if(A[iCnt2] < A[iCnt+1])
{
Temp = A[iCnt2];
A[iCnt2] = A[iCnt+1];
A[iCnt+1] = Temp;
}
}
++iCheck;
}
}
// 정렬된 결과를 출력한다.
for(iCnt=0;iCnt<iNum;++iCnt)
{
printf("%d ->", A[iCnt]);
}
// 총 계산 횟수를 출력한다.
printf("계산횟수 : %d\n", iCheck);
return ;
}
- 실행 결과 (내림차순)
- 실행 결과 (오름차순)
'내장형 하드웨어 > C언어' 카테고리의 다른 글
C언어 - 열거형의 활용 (메시지 맵의 기본 형식) (0) | 2011.08.18 |
---|---|
C언어 - 열거형(enum) (0) | 2011.08.17 |
C언어 - 분할컴파일을 통한 static, extern 확인 (0) | 2011.07.22 |
C언어 - 저장클래스(지속기간, auto, register, static, extern) (0) | 2011.07.19 |
C언어 - 연결리스트 (0) | 2011.07.18 |