C 자료구조와 알고리즘
정렬 알고리즘
june__Park
2021. 6. 29. 19:05
#include <stdio.h>
#include <stdlib.h> // srand(), rand()
#include <time.h> // time()
void setArrRandom();
void printArr();
void bubbleSort();
void mergeConquer(int l, int m, int r);
#define MAX 10
int arr[MAX] = {0};
void setArrRandom(){
// 1 ~ 1000
srand(time(NULL));
int i;
for(i = 0; i < MAX; ++i){
arr[i] = (rand() % 1000) + 1; // 1이상 ~ 1000미만의 랜덤 수
}
}
void printArr(){
int i;
for(i = 0; i < MAX; ++i){
printf("%d ", arr[i]);
}
printf("\n");
}
void selectionSort(){
int i, j;
int tmp;
for(i = 0; i < MAX-1; ++i){ // 0 <= i < MAX-1
for(j = i+1; j < MAX; ++j) { // i+1 <= j < MAX
if(arr[i] > arr[j]){
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
void bubbleSort(){
int i, j;
int tmp;
for(i = 0; i < MAX-1; ++i){ // MAX-1 회 실행
for(j = 0; j < MAX-i-1;++j) {
if(arr[j] > arr[j+1]){
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
void insertionSort(){
int tmp;
int i, j;
for(i = 1; i < MAX; ++i){
tmp = arr[i];
for(j = i; tmp < arr[j-1]; --j){
arr[j] = arr[j-1];
}
arr[j] = tmp;
}
}
/*
분할-정복 알고리즘
=> 퀵정렬, 합병정렬에서 사용
=> 문제를 해결할 수 있을 때까지 그 문제를 쪼갠다.(재귀적 호출) ==> 분할(divide)
쪼개진 문제들을 해결하면서 해결된 문제들을 합쳐나간다. ==> 정복(conquer)
*/
int tmp_arr[MAX] = {0};
void mergeDivide(int left, int right){
// left : ? // right : ? // mid : ?
if(left == right){
return;
}
// 반으로 쪼갠다.
int mid = (left + right) / 2;
mergeDivide(left, mid);
mergeDivide(mid+1, right);
mergeConquer(left, mid, right);
}
void mergeConquer(int l, int m, int r){
int a = l;
int b = m + 1;
int c = l;
while(a <= m && b <= r){
if(arr[a] < arr[b]){
tmp_arr[c] = arr[a];
++a;
}
else {
tmp_arr[c] = arr[b];
++b;
}
++c;
}
int x = a > m ? b : a;
int y = a > m ? r : m;
for(; x <= y; ++x){
tmp_arr[c] = arr[x];
++c;
}
int i;
for(i = l; i <= r; ++i){
arr[i] = tmp_arr[i];
}
}
void main(){
setArrRandom();
printf("정렬 전 : ");
printArr();
selectionSort();
//bubbleSort();
//insertionSort();
//mergeDivide(0, MAX-1);
printf("정렬 후 : ");
printArr();
}