문자열 검색 ? 지정된 문자열에서 특정 문자열이 포함되어 있는지? 있다면 어느 위치에 있는지를 찾아내는 것 브루트-포스법 원본 문자열을 text, 검색할 문자열을 pattern이라고 부르기로하자. 포루트 포스법은 선형 검색을 확장한 단순한 알고리즘으로 단순법, 소박법이라고도 한다. 브루트-포스법은 text에 가장 앞쪽(0번 위치)부터 시작하여 pattern과 문자단위로 비교하면서 찾아가는 도중 중간에 서로 다른 문자가 발생 시 그동안 일치했던 것 문자들은 모두 무효화되고 text에서 그 다음 위치로 이동하여 다시 비교를 시작하는 방식이다. 그렇기에 효율은 좋지 않다. . //문자열 검색 static int bfMatch(String txt, String pat){ int pt = 0; // 텍스트 포인트..
힙 정렬 힙 정렬은 선택 정렬을 응용한 알고리즘으로 힙의 특성을 이용한 정렬입니다. 힙 : 부모값이 자식값보다 항상 크다(작다)라는 조건을 만족하는 완전이진트리, 힙에 루트는 항상 모든 수 중 가장 큰 값이 위치한다. 트리 root(루트) : 트리에 가장 상위부분 parent(부모), child(자식) : 트리에서 요소의 상하 관계 sibling(형제) : 자식 간의 관계 완전이진트리 : 트리의 한 종류 완전 : 부모가 자식을 왼쪽부터 추가하는 모양을 유지 이진 : 부모가 가질 수 있는 자식의 수가 최대 2개이다. 힙 트리의 한 종류이다. 항상 완전이진트리의 형태를 가져야한다. 힙에서 부모와 자식 사이의 대소관계는 일정하나 형제 간의 대소관계는 일정하지 않을 수 있다. 여기서 일정하다라는 것은 상대적으로..
도수 정렬 요소들의 대소관계를 직접 비교하지 않고 빠르게 정렬할 수 있는 알고리즘. 도수정렬의 경우 정렬기준에 따른 요소들 사이의 직접적인 비교를 할 필요가 없다. 총 4단계 과정을 통하여 요소들을 정렬할 수 있다. 도수분포표 만들기 만들어진 도수분포표를 활용하여 누적 도수분포표 만들기 목표 배열 만들기 배열 복사하기 위에 4개의 단계를 전체적인 코드를 통하여 부분적으로 확인해보고자 한다. //도수정렬 static void countionSort(int[] a, int n , int max){ int[] f = new int[max + 1]; int[] b = new int[n]; for(int i = 0 ; i < n ; i++) f[a[i]]++; for(int i = 1 ; i < f.length;..
병합 정렬 배열 앞부분(영역)과 뒷부분(영역)으로 분할하여 정렬 후 다시 병합(합치기)하는 작업을 반복하며 정렬하는 알고리즘 병합 과정? 위와같이 배열을 앞, 뒤로 나눠서 각자 정렬한 후에 각각의 분할된 배열을 앞에서부터 서로 비교하며 기존 배열에 병합하게 된다. 이때 비교 대상인 두 배열 중 비교 후 값으로 선택되면 그 값이 있던 배열은 다음 요소로 이동하며 비교해나간다. //두 배열 병합하기 static void merge(int[] a,int na,int[] b,int nb, int[] c){ int pa = 0; int pb = 0; int pc = 0; while(pa < na && pb < nb) c[pc++] = a[pa] < b[pb] ? a[pa++] : b[pb++]; // a , b ..
퀵 정렬 찰스 앤터니 리처드 호어(C. A. R. Hoare)가 알고리즘의 정렬 속도가 매우 빠른 데서 착안해 직접 붙인 이름이다. 범위에 있는 배열 요소들에 대해서 기준 값(=피벗) 하나를 정하고 기준 값과 정렬 조건(작은순, 큰 순 등)에 따라 좌우에 있는 요소들을 교환하며, 정렬을 마칠 때까지 지속적으로 좌우로 범위를 분할해가면서 정렬하는 알고리즘이다. 자세한 부분은 그림을 참고하면 이해를 돕는데 좋을 것이라 생각한다. static void swap(int[] a, int idx1 , int idx2){ int t = a[idx1]; a[idx1] = a[idx2] ; a[idx2] = t; } static void quickSort(int[] a, int left, int right){ int p..
셸 정렬 도날드 셸(D. L. Shell)에 의해 고안되었으며, 퀵 정렬이 나오기 전까지 가장 빠른 정렬 알고리즘이었다. 셸 정렬은 단순 삽입 정렬의 장점은 살리면서 단점은 보완하여 좀 더 빠르게 정렬 가능한 정렬 알고리즘이다. 일정한 간격으로 서로 떨어져 있는 두 요소를 그룹으로 묶어 대략 정렬을 수행하고, 간격을 좁혀 그룹의 수를 줄이면서 정렬을 반복하여 요소의 이동 횟루를 줄이는 정렬 알고리즘이다. 단순 삽입 정렬 장점 : 배열이 이미 많은 부분 정렬되어 있을 시 정렬 속도가 굉장히 빠르다. 단순 삽입 정렬 단점 : 삽입할 곳이 멀리 떨어져 있을 시 거리에 비례해서 이동하는 횟수가 많아진다. -> 삽입할 위치와 현재 위치 사이에 위치한 요소들을 현재 위치까지 모두 한 칸씩 이동 시키고 삽입해야한다...