<개인공부>/[Algorithm] 8

퀵 정렬 (Quick Sort) 이론과 코드

안녕하세요. BlockDMask 입니다. 오늘은 지난시간에 언급 한 대로 퀵 정렬, 퀵 소트(Quick Sort)에 대해 알아보겠습니다.부족한 부분이나 이상한 부분이 있으면 댓글 부탁드리겠습니다. 0. 원리Quick sort(퀵 소트)는 divide and conquer (분할 정복) 방식으로 정렬을 수행합니다.Quick sort(퀵 소트)는 n 개의 데이터를 정렬할때, 평균적으로 O(nlogn) 번을 수행하고 최악의 경우 O(n^2) 번을 수행합니다.평균적으로 log 의 시간복잡도를 가지기 때문에 다른 정렬 알고리즘에 비해 속도가 빠르므로, 사용빈도가 높습니다. 과정 : 리스트에서 임의의 원소를 고릅니다. 그것을 pivot이라 합니다. (일반적으로 가운데 원소를 고릅니다.) : pivot의 앞에는 pi..

[탐색] lower_bound, upper_bound

안녕하세요. BlockDMask 입니다.오늘은 이진탐색과 유사하나 조금 다른 lower_bound 와 upper_bound에 대해 알아보겠습니다.1. lower_boundlower_bound 란? - 이진탐색(Binary Search)기반의 탐색 방법입니다. (배열 또는 리스트가 정렬 되어있어야 한다.) - lower_bound는 찾으려 하는 key값이 "없으면" key값보다 큰 가장 작은 정수 값을 찾습니다. - 같은 원소가 여러개 있어도 상관 없으며, 항상 유일한 해를 구할 수 있습니다. - 구간이 [start, end]인 배열이 있을때, 중간위치의 index를 mid 라고 하면, arr[mid-1] < key 이면서 arr[mid] >= key 인 최소의 m 값을 찾으면 됩니다. (m>=2) 직접 ..

[탐색] 이진탐색 (Binary Search) 구현 방법

안녕하세요. BlockDMask 입니다. 알고리즘 코딩 사이트(백준 온라인 저지)에서 '수 찾기' 문제를 풀다가 이진탐색(Binary Search)이 나와서, 이번 기회에 정리를 해볼까 합니다. 1. 이진탐색(Binary Search) 이란.이진 탐색 알고리즘(Binary Search Algorithm)은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘 입니다. 오름차순으로 정렬된 리스트의 중간 값을 임의의 값으로 선택하여, 찾고자 하는 Key값과 비교하는 방식으로 돌아가는 알고리즘 입니다. 정렬된 리스트에서만 사용할 수 있다는 단점이 존재합니다. 검색이 될때마다 선형탐색(Linear Search)와는 비교할 수 없게 빨라집니다. 2. 이진탐색(Binary Search)의 시간 복잡도 입..

[알고리즘의 정의] Algorithm?

[Algorithm ?] 주어진 문제를 해결하기 위한 단계, 절차 또는 여러 동작의 모임를 말한다. 이 절차에는 입력값과 출력값이 존재해야하며, 유한한 단계를 거쳐서 반드시 종료 되어야 한다. 입력 : 외부에서 제공되는 자료가 0개 이상 존재해야한다.출력 : 적어도 1개 이상의 서로 다른 결과를 내어야 한다.(즉 모든 입력에 하나의 출력이 나오면 안됨)명확성 : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다.유한성(종결성) : 알고리즘의 명령어들은 끝이 있는 계산을 수행한 후에 종료해야 한다.(출처-동아출판 중학교 정보책 날짜-2017-7-11)효율성 : 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 한다. https://ko.wikipedia.org/wiki/%EC%95%8C%E..

선택 정렬 (Selection Sort) 이론과 코드

안녕하세요. BlockDMask 입니다. 오늘은 간단한 정렬 알고리즘 중에 선택 정렬(Selection Sort)에 대해서 알아 보도록 하겠습니다. 보시다가 이상하거나 궁금한 부분이 있으면 댓글 부탁드리겠습니다. 0. 원리오름 차순 기준일때 해당 하는 배열 안에서 가장 작은 값부터 찾아서 맨 앞부터 정렬 시키는 방법 입니다.그림으로 그려보겠습니다. 주어진 배열(리스트) 중에 최소값을 찾습니다. -> 그 최소값과 맨 앞의 값을 바꾸어 줍니다(swap) -> 바꿔서 fixed 된 값을 제외하고 나머지 배열(리스트) 중에 최소값을 찾습니다. -> 그 최소값과 나머지 배열중에 맨 앞의 값을 바꾸어 줍니다(swap) -> -> -> 쭉쭉쭉. 1. 코드 및 결과 > 코드(C++) 1234567891011121314..

삽입정렬 (Insertion Sort) 이론과 코드

안녕하세요. BlockDMask 입니다. 오늘은 간단한 정렬 알고리즘 중에 삽입 정렬 (Insertion Sort) 에 대해서 알아보겠습니다. 이상한 곳이 있으면, 댓글로 말해주시기 바라겠습니다.댓글을 보고 고치도록하겠습니다. 따끔한 지적 부탁드리겠습니다. 0. 원리Insertion Sort 는 말 그대로 '삽입' 꽂아 넣는 정렬입니다. 자신보다 앞의 원소가 큰지 작은지 비교를 하여서 자신의 위치를 찾아서 '삽입' 하는 정렬입니다. 앞의 원소를 비교해야 하기 때문에 arr[1]~arr[n] 까지 진행합니다. (두번째 원소인 arr[1] 부터 시작.) 삽입을 하면 데이터가 하나씩 밀려야 하기 때문에 배열이 길어질수록 효율이 떨어집니다. 그림을 통해서 과정을 살펴 보겠습니다. (오름차순을 기본으로 하겠습니다..

버블정렬 (Bubble Sort) 이론과 코드

안녕하세요, BlockDMask 입니다. 오늘은 정렬 알고리즘 중에 버블 소트 (Bubble Sort)에 대해서 알아보도록 하겠습니다. 앞으로 제가 아는 sort들을 포스팅 해볼 예정입니다 버블 정렬 - bubble sort 삽입 정렬 - insertion sort 선택 정렬 - selection sort 퀵 정렬 - quick sort 병합 정렬 - merge sort 기수 정렬 - radix sort 이 순서대로 정렬 포스트를 진행 해 보도록 하겠습니다. 0. 원리Bubble Sort는 말 그대로 거품처럼 동글동글 하면서 sorting을 합니다. 거품을 연상하시면 쉬울 겁니다. 두 인접한 원소를 비교하는 정렬입니다. 오름차순으로 정렬을 한다고 했을때, 처음 한 바퀴를 돌게 되면 맨 뒤에 있는 인자가 ..

[유클리드 알고리즘] GCD 최대공약수 (반복문, 재귀)

안녕하세요. BlockDMask 입니다. 유클리드 알고리즘은 사실 알고리즘 카테고리를 새로 만들어서 작성해야하는데, 조만간에 이사하도록 하겠습니다. 1) "유클리드 알고리즘"이란.유클리드 알고리즘은 주어진 두 수 사이에 존재하는 최대공약수(GCD)를 구하는 알고리즘 입니다. GCD - greatest common divisor 2) "유클리드 알고리즘" 원리.임의의 두 자연수 a, b가 주어졌을때. 둘중 큰 값이 a라고 가정해보겠습니다.a를 b로 나눈 나머지를 n 이라고 하면 (a%b = n)n이 0일때, b가 최대 공약수(GCD)입니다.만약 n이 0이 아니라면, a에 b값을 다시 넣고 n를 b에 대입 한 후 다시 위에 step2부터 반복하면 됩니다.3) "유클리드 알고리즘" 접근방법.두가지 접근 방법이..