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();
}

선택정렬알고리즘