알고리즘 구현하기
이 문서는 알고리즘을 프로그램으로 구현하는 모습을 시연을 통해 보이기 위한 문서입니다. 아래에서 구현된 모든 프로그램은 http://ideone.com 에서 C로 작성한 것들입니다.
n!을 구하는 재귀적 알고리즘
알고리즘
procedure n! if (n>1) then n!=n×(n-1)! if (n=1) then n!=1
프로그램
#include <stdio.h> long Factorial (int n) // n을 받아 n!을 반환하는 함수 정의 { if (n>1) return (n*Factorial(n-1)); // n>1이면, n!=n×(n-1)! else return 1; // n=1이면, n!=1 } int main (void) { int number; // 변수 number 선언 scanf("%d",&number); // number 값 입력 받기 printf ("%d! = %ld",number,Factorial(number)); // n! 출력하기 return 0; }
교체 알고리즘
void Swap (int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
최대값 알고리즘
프로그램
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 8 int Max (int *List, int n) { int MaxNum = List[0]; int k=1; while (k<n) { if (MaxNum < List[k]) MaxNum = List[k]; k = k + 1; } return MaxNum; } int main(void) { int NumList[N]; int i=0; srand(time(NULL)); // 랜덤 함수 초기화 while (i<N) { NumList[i] = rand()%100 + 1; // 1부터 100까지의 수 중에 랜덤으로 NumList에 입력 printf ("%d\t",NumList[i]); // NumList를 탭 단위로 출력 i = i + 1; } printf ("\nThe biggest number is %d", Max(NumList,N)); // 한 줄 다음에 최대값 출력 return 0; }
버블 정렬
void BubbleSort (int *List, int n) { int i,j; for (i=0;i<n-1;i=i+1) for (j=i+1;j<n;j=j+1) if (List[i] > List[j]) Swap(List+i,List+j); }
퀵 정렬
int Partition (int *List, int n) { int i,j; for (i=1,j=1;i<n;i=i+1) { if (List[0]>List[i]) { if (i>j) Swap (List+j,List+i); j = j + 1; } } Swap (List,List+j-1); return j; } void QuickSort (int *List, int n) { if (n<=1) return; int cut; cut = Partition (List,n); QuickSort(List,cut); QuickSort(List+cut,n-cut); }
순차 검색 알고리즘
알고리즘
procedure SequentialSearch (List,TargetValue) if (List가 비어 있음) then (검색의 실패를 선언한다) else (리스트상의 첫 번째 항목을 TestEntry로 선택한다; while (TargetValue<TestEntry이고 비교할 항목이 남아 있음) do (리스트상의 다음 항목을 TestEntry로 선택한다); if (TargetValue=TestEntry) then (검색의 성공을 선언한다) else (검색의 실패를 선언한다) ) end if
프로그램
#include <stdio.h> #define NOT_EXIST 0 #define EXIST 1 int SequentialSearch (int *List, int n,int TargetValue) { if (n<1) return NOT_EXIST; else { int test; test = 0; while (TargetValue > List[test] && test < n) { test = test + 1; } if (TargetValue==List[test]) return EXIST; else return NOT_EXIST; } } int main (void) { int TargetValue, List[8]; List[0] = 3; List[1] = 4; List[2]= 10; List[3]=23; List[4] = 32; List[5] = 43; List[6]=55; List[7]=90; scanf ("%d", &TargetValue); if (SequentialSearch(List,8,TargetValue)==1) printf("%d is exist.",TargetValue); else printf("%d is not exist.",TargetValue); return 0; }
이진 검색 알고리즘
알고리즘
procedure BinarySearch (List,TargetValue) if (List가 비어 있음) then (검색 실패를 보고한다) else [리스트의 "중앙" 항목을 TestEntry로 선택한다; if (TargetValue=TestEntry) (검색 성공을 보고한다) else if (TargetValue<TestEntry) (TargetValue가 TestEntry 앞의 리스트 부분에 있는지 보기 위해 BinarySearch 프로시저를 적용하고, 검색 결과를 보고한다) else if (TargetValue>TestEntry) (TargetValue가 TestEntry 뒤의 리스트 부분에 있는지 보기 위해 BinarySearch 프로시저를 적용하고, 검색 결과를 보고한다) ] end if
프로그램
#include <stdio.h> #define NOT_EXIST 0 #define EXIST 1 int BinarySearch (int *List, int n, int TargetValue) { if (n==0) return NOT_EXIST; else { int test; test = (n-1)/2; printf ("항목 %d와 비교\n",test,List[test]); if (TargetValue == List[test]) return EXIST; else if (TargetValue > List[test]) return BinarySearch (List+test+1,n-test-1,TargetValue); else return BinarySearch(List,test,TargetValue); } } int main (void) { int TargetValue, List[8]; List[0] = 3; List[1] = 4; List[2]= 10; List[3]=23; List[4] = 32; List[5] = 43; List[6]=55; List[7]=90; scanf ("%d", &TargetValue); if (BinarySearch(List,8,TargetValue)==1) printf("%d is exist.",TargetValue); else printf("%d is not exist.",TargetValue); return 0; }
모두 구현해보기
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10000 #define NOT_EXIST 0 #define EXIST 1 void Swap (int*, int*); void MakingList (int*, int); void MakingSortedList (int*, int); void PrintList (int*, int); void BubbleSort (int*, int); int Partition (int*, int); void QuickSort (int*, int); int SequentialSearch (int*, int, int); int BinarySearch (int*, int, int); void PrintSearchResult (int*, int, int); int main(void) { int NumList[N]; int TargetValue; MakingSortedList(NumList,N); PrintList(NumList,N); scanf("%d",&TargetValue); PrintSearchResult (NumList,N,TargetValue); return 0; } void MakingList (int* List, int n) { int i; for (i=0;i<n;i=i+1) List[i] = rand()%(N*10) + 1; } void MakingSortedList (int* List, int n) { MakingList(List,n); QuickSort (List,n); } void PrintList (int* List, int n) { int i; for (i=0;i<n;i=i+1) { printf("%d\t",List[i]); if (i%16==15) printf("\n"); } printf("\n"); } void Swap (int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void BubbleSort (int *List, int n) { int i,j; for (i=0;i<n-1;i=i+1) for (j=i+1;j<n;j=j+1) if (List[i] > List[j]) Swap(List+i,List+j); } int Partition (int *List, int n) { int i,j; for (i=1,j=1;i<n;i=i+1) { if (List[0]>List[i]) { if (i>j) Swap (List+j,List+i); j = j + 1; } } Swap (List,List+j-1); return j; } void QuickSort (int *List, int n) { if (n<=1) return; int cut; cut = Partition (List,n); QuickSort(List,cut); QuickSort(List+cut,n-cut); } int SequentialSearch (int *List, int n,int TargetValue) { if (n<1) return NOT_EXIST; else { int test; test = 0; while (TargetValue > List[test] && test < n) { test = test + 1; } if (TargetValue==List[test]) return EXIST; else return NOT_EXIST; } } int BinarySearch (int *List, int n, int TargetValue) { if (n==0) return NOT_EXIST; else { int test; test = (n-1)/2; if (TargetValue == List[test]) return EXIST; else if (TargetValue > List[test]) return BinarySearch (List+test+1,n-test-1,TargetValue); else return BinarySearch(List,test,TargetValue); } } void PrintSearchResult (int *List, int n, int TargetValue) { if (BinarySearch(List,n,TargetValue)) printf("%d is exist.",TargetValue); else printf("%d is not exist",TargetValue); }