본문 바로가기

Development

알고리즘 정렬 정리

선택 정렬 (Selection Sort)

  • 주어진 리스트에서 최소값을 맨 앞으로 옮기며 정렬.
  • 내림차순의 경우 최대값을 맨 앞으로 옮김.
  • 시간 복잡도 : //( O(n^2) //)
#include <stdio.h>
#include <algorithm>
using namespace std;

int main(){
	int n,min=0;
	int i,j;
	int num[1001];
	scanf("%d", &n);
	for(int i=0;i<n;i++)
		scanf("%d", &num[i]);

	for(i=0;i<n;i++){
		for(j=i;j<n;j++)
			if(num[i]>num[j]) 
				swap(num[i], num[j]);
	} 

	for(int i=0;i<n;i++)
		printf("%d\n", num[i]);

	return 0;
}

Baekjoon 2750 수 정렬하기

 

합병 정렬 (Merge Sort)

  • 분할 정복 알고리즘 중 하나
  • 재귀를 이용하여 리스트를 각 원소별로 나누고 정렬
  • 시간 복잡도 : //( O(n log n) //)
#include <stdio.h>
#include <algorithm>
#define N 1000001
using namespace std;

int sortNum[N];
void mergeSort(int num[], int left, int right);
void merge(int num[], int left, int mid, int right);

int main(){
	int n;
	int num[N];
	scanf("%d", &n);
	for(int i=0;i<n;i++)
		scanf("%d", &num[i]);

	mergeSort(num, 0, n-1);
	for(int i=0;i<n;i++)
		printf("%d\n", num[i]);

	return 0;

}

void mergeSort(int num[], int left, int right){
	if(right <= left) return;
	int mid = (left+right)/2;
	mergeSort(num, left, mid);
	mergeSort(num, mid+1, right);
	merge(num, left, mid, right);
	
}

void merge(int num[], int left, int mid, int right){
	int i=left;
	int j=mid+1;
	int k=left;
	int flag;
	while(i<=mid && j<=right){
		if(num[i] < num[j]){
			sortNum[k++] = num[i++];
			flag=0;
		}
		else{
			sortNum[k++] = num[j++];
			flag=1;
		}
	}
	if(flag){
		for(int q=i;q<mid+1;q++)
			sortNum[k++] = num[q];
	} else {
		for(int q=j;q<=right;q++)
			sortNum[k++] = num[q];
	}

	for(int q=left;q <=right;q++){
		num[q] = sortNum[q];
	}
}

Baekjoon 2751 수 정렬하기2

 

퀵 정렬 (Quick Sort)

  • 리스트의 원소 중 피벗(Pivot)을 무작위로 고름.
  • 이를 중심으로 왼쪽은 피벗보다 작은 값, 오른쪽은 큰 값으로 정렬.
  • 시간 복잡도 : //( O(n log n) //)
#include <stdio.h>
#include <algorithm>
#define N 1000001
using namespace std;

void quickSort(int num[], int left, int right);

int main(){
	int n;
	int num[N];
	scanf("%d", &n);
	for(int i=0;i<n;i++)
		scanf("%d", &num[i]);

	quickSort(num, 0, n);
	for(int i=0;i<n;i++)
		printf("%d\n", num[i]);
}

void quickSort(int num[], int left, int right){
	if(right <= left) return;
	int pivot=num[left];
	int i=left, j=right;
	while(1){
		do{
			i++;
		} while(pivot > num[i] && i<=j);
		do {
			j--;
		} while(pivot < num[j] && i<=j);
		if(i<j) swap(num[i], num[j]);
		else break;
	}
	swap(num[left], num[j]);
	quickSort(num, left, j);
	quickSort(num, j+1, right);

	
}

Baekjoon 2751 수 정렬하기2 (시간 초과로 인해 코드 수정 필요)

 

계수 정렬 (Counting Sort)

  • 일반적 상황에서 가장 빠른 정렬 알고리즘
  • 하지만 범위가 정해지지않은 경우, 메모리 낭비 유발 가능성 높음
  • 시간 복잡도 : //( O(n) //)
#include <stdio.h>

int main(){
	int n, temp;
	int num[10001]={0,};
	scanf("%d", &n);
	for(int i=0;i<n;i++){
		scanf("%d", &temp);
		num[temp]++;
	}

	for(int i=0;i<10001;i++){
		if(num[i]>0){
			for(int j=0;j<num[i];j++)
				printf("%d\n", i);
		}
		else continue;
	}
}

Baekjoon 10989 수 정렬하기3

 

'Development' 카테고리의 다른 글

CodeUp 기초100제 (바둑알 십자뒤집기)  (0) 2020.10.18
Win32 API 정리  (0) 2019.03.06
알고리즘 DP 정리  (0) 2019.01.22
기초 자료구조 정리(리스트, 그래프, 트리)  (0) 2019.01.14
다익스트라 알고리즘  (0) 2018.12.04