일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- full adder
- Tautology
- 써킷
- 항진명제
- 모두의네트워크요약
- GPT-1
- statement equivalence
- Sentiment Analysis
- half adder
- Binary notation
- relationaldatabaseschema
- 모두의네트워크
- 명제 동치
- Gate
- 모순명제
- 십진법
- Logical statement
- cnn
- Circuit
- 모두의네트워크정리
- dnf
- Decimal notation
- 이진법 십진법 변환
- 명제
- ermodel
- Contradiction
- Digital Logic Circuits
- 진리표
- CNF
- truth table
- Today
- Total
NLP Learner in Switzerland
[C] Selection Sort in Ascending & Descending Order ::: 선택정렬 본문
[C] Selection Sort in Ascending & Descending Order ::: 선택정렬
초코빵 2021. 3. 30. 10:32
까다로운 부분 알아가기
[1] array size를 설정하지 않으면 자꾸 어디선가 에러가 난다...
▶ 직접 대괄호안에 숫자를 넣어주거나 const int로 제한해준다. 다른 방법은 아직 모르기로 함.
[2] Selection Sort(선택정렬) 알고리즘은
▶ 오름차순인경우에는 매 루프마다 가장 작은 값을 '선택'해서 얘랑 맨 앞 값이랑 바꿔준다. 그러면 가장 작은 애가 계속 앞으로 오게되므로 오름차순으로 정렬이 되는 것. 여기까지는 어딜가도 설명이 되어있다. 문제는 그래서 코드를 어케 만든다는겨...
▶ 일단, 가장 작은 애를 선택 하려면 뭔가랑 비교해서 얘가 작은지 큰지를 알아야 할텐데 어떻게 알지? 선택정렬 알고리즘에서는 계속 루프를 돌면서 더 작은 애, 더 작은 애로 계속 업데이트 해나가면서 찾아나선다. 특정 고정된 애랑 비교하는 게 아님. 하지만 바꿔줄 대상이 되는 맨 앞 값은 고정이어야 나중에 제일 작은 애를 찾아냈을 때 서로 바꿔치기 해줄 수 있다. 이게 난 이해가 안가서 수십번 반복한 후에 겨우 조금 이해한 것 같다. 개초보.
[3] 이렇게 선택정렬 설명에 따라 변수를 선언하면,
▶ 오름차순 정렬인 경우에는, 최솟값을 맨 앞과 바꿀거라 min으로 선언해주고 min을 계속 더 작은 애로 업데이트한다.
▶ 내림차순 정렬인 경우에는, 최댓값을 맨 앞과 바꿀거라 max로 선언해주고 max를 계속 더 큰 애로 업데이트 한다.
▶ 이렇게 찾아낸 최솟값 or 최댓값을 맨 앞 값과 '교체' 해줄 때 잠깐 쓰는 변수 temp도 선언해준다.
[4] min과 max는 어쨌든 최초에 비교가 시작되려면 초기화를 해주어야 한다.
▶ min을 최초에 array의 index(i)와 동일하게 선언해주고(인덱스를 따라가므로 outer for loop안에서 초기화 되어있음) 그 다음 값(i+1)과 비교해서 그 다음값이 min보다 더 작다고 판단하면, 엇 내가 제일 작은 줄 알았는데 아니었음. 하면서 황급히 min을 그 더 작은 애로 교체해준다. max는 엇 내가 제일 큰 줄 알았는데 아니었음. 인 경우이다.
[5] 두 변수를 교체(swap)하려면 코드 3줄이 필요하다.
▶ temp=variable1; variable1=variable2; variable2=temp; 이 3줄이며 이해할 필요없이 그냥 암기하면 된다.
[6] input을 non-number(숫자가 아닌 무언가)가 있을 때까지 계속 받으라고 되어있다.
▶ scanf(입력)가 있으면 계속 받을 수 있게 while loop로 구성해주면서(input을 받아서 구성할 array의 길이를 미리 알면 for loop로도 할 수 있지만 우린 모르므로) length를 계산해준다.
[7] 그럼 non-number를 어떻게 처리해야 할까?
▶ "%*s"를 사용한다. 여기서 중요한 것은 *(asterisk symbol)이다. scanf에서 *의 의미는 'read but ignore'이다. 즉, 읽어는 들이되 변수에 넣지는 않는다는 뜻이다. 왜 갑자기 이걸 쓸까? 문제에 있는 예시에 보면 'end'라는 string을 입력해서 input을 끝낸 것을 알 수 있다. 즉, 뭔가 non-number가 나오면 에러가 없이 입력자체는 되어야 하는데, 그 값이 array에 들어가버리면 안되기 때문이다.
#include <stdio.h>
const int MAX = 1001; ------------------ [1]
void ascSelectionSort(int A[], int n){
int i,j,min,temp; ------------------ [3]
for(i=0;i<n;i++){
min=i; ------------------------- [4]
for(j=i+1;j<n;j++){
if(A[j]<A[min]){
min=j; ----------------- [4]
}
}
temp=A[i]; --------------------- [5]
A[i]=A[min];
A[min]=temp;
}
printf("Ascending Order: ");
for(i=0;i<n;i++){
printf("%d ",A[i]);
}
}
void descSelectionSort(int A[], int n){
int i,j,max,temp; ------------------ [3]
for(i=0;i<n;i++){
max=i; ------------------------- [4]
for(j=i+1;j<n;j++){
if(A[j]>A[max]){
max=j; ----------------- [4]
}
}
temp=A[i]; --------------------- [5]
A[i]=A[max];
A[max]=temp;
}
printf("\nDescending Order: ");
for(i=0;i<n;i++){
printf("%d ",A[i]);
}
}
int main(){
int A[MAX];
printf("Values of A separated by spaces (non-number to stop): ");
int n;
while(scanf("%d",&A[n])==1){ ------- [6]
n++;
}
scanf("%*s"); ---------------------- [7]
ascSelectionSort(A,n);
descSelectionSort(A,n);
return 0;
}
출력결과
'Algorithm in C > Exercise' 카테고리의 다른 글
[C] Multiple Recursion ::: 재귀호출이 2번 이상 일어나는 경우 (0) | 2021.04.01 |
---|---|
[C] Basic Recursion ::: 재귀함수로 거듭제곱 나타내기 (0) | 2021.03.31 |
[C] Matrix Multiplication ::: 행렬의 곱 (0) | 2021.03.29 |
[C] Perfect Square Number ::: 제곱수 판별하기 (0) | 2021.03.29 |
[C] Reverse String ::: 문자열을 입력받아 거꾸로 출력하기 (0) | 2021.03.29 |