본문 바로가기

알고리즘

(6)
[알고리즘/계수정렬(Counting Sort)] - 자바 계수정렬에 대해 알아보자 지난 포스팅에서 대부분의 sort알고리즘을 살펴보았는데요. 그 중 빠르다고 할 수 있는 알고리즘은 O(NlogN)의 속도를 자랑하는 퀵정렬,병합정렬이 있죠. 하지만 특정한 경우에 이 알고리즘들 보다도 더 빠른 알고리즘이 존재합니다. 무려 O(N)의 속도를 보입니다. 바로 계수정렬(Counting Sort)인데요. 이름만 봐도 아시겠지만 맞습니다. 세는거에요! [6,3,5,4,8,4,0,3,4,8,0,5,3,2,5,7,8,3,1,2,4] 이러한 데이터가 있다고 가정했을 때 가장 큰 값이 8 작은 값이 0입니다. 이 데이터를 정렬한다고 할게요. 0~8의 인덱스를 가지는 1차 배열을 선언해주고 데이터를 돌아가면서 각 인덱스에 값을 1씩 ++해줍니다. 맞습니다 개수를 세는거에요. 그렇게..
[알고리즘/병합정렬(Merge Sort)] -자바 병합정렬에 대해 알아보자 ‘존 폰 노이만(John von Neumann)’이라는 사람이 제안한 방법입니다. O(NlogN)을 보장해요. 일단 반으로 나누고 보는거에요. 이런식으로 저장이 될텐데요. 처음에 정렬되어있지 않은 배열을 가장 작게 쪼갠 뒤에 합치면서 정렬하는 거에요. 여기서 어떻게 정렬해서 들어가는지 궁금하시죠? 저는 궁금했거든요 ㅎ 두개는 지금 떨어져있지만 메모리상에서는 붙어있는 것과 같습니다. 그래서 index를 x,mid,y로 구분해준 뒤에 x는 mid로 접근하고 mid에서 y로 접근하면서 값을 비교해서 배열에 넣어가면서 정리하면 됩니다. 그럼결국 N번만에 가능하잖아요?? 코드 public class 분할정렬 { static int[] sorted = new int[8]; public st..
알고리즘의 시작 정렬 알고리즘(sort Algorithm) 4. 퀵 정렬 안녕하세요 오늘은 퀵정렬입니다. 이름에도 써 있듯 퀵(quick)하게 정렬 됩니다. 이해하는데 한참 걸렸어요 ㅜㅜ 시작해보겠습니다. 퀵정렬 분할해서 정렬한다고 생각하시면 되는데 [1,10,5,8,7,6,4,3,2,9] 퀵정렬에서는 피봇값을 하나 잡습니다. 여기서는 첫번째 것을 잡아볼게요 [1,10,5,8,7,6,4,3,2,9] 왼쪽에는 아무것도 없으니 그대로 두고 오른쪽 부분에서 오른쪽으로 이동하면서 나보다 큰값을 찾고 왼쪽으로 이동하면서 나보다 작은 값을 찾습니다. [1,10,5,8,7,6,4,3,2,9] 나보다 큰 값은 10이 될 것이고 작은 값은 없고 다시 나에게로 오게 됩니다. 이렇게 엇갈렸을 때는 작은 값과 피봇값을 바꿔 줍니다. 자기 자신을 바꾸는 것이니 그대로 [1,10,5,8,7,6,4,3..
알고리즘의 시작 정렬 알고리즘(sort Algorithm) 3. 삽입 정렬 세 번째 시간입니다. 오늘은 삽입 정렬 가지고 왔습니다. 마지막에 앞서서 봤던 선택, 버블 정렬과 오늘 볼 삽입 정렬들을 비교 해보겠습니다ㅎ 삽입 정렬 삽입 정렬은 앞선 정렬들 보다는 더 나은(?) 정렬 알고리즘이라고 볼 수 있는데요. 삽입정렬은 말 그대로 각 숫자를 들어가야 할 곳에 삽입하는 알고리즘입니다. [2,7,4,6,8,10,5,1,3,9] 자 똑같은 데이터가 있습니다. 처음으로 인덱스 1에 있는 숫자를 가지고 왼쪽의 있는 수 와 비교합니다. [2,7,4,6,8,10,5,1,3,9] 그 자리에 그대로 있겠네요. 인덱스 2에 있는 수와 왼쪽의 있는 데이터들과 비교하면 들어갈 자리가 명확하죠. [2,4,7,6,8,10,5,1,3,9] 이런 식으로 [2,4,6,7,8,10,5,1,3,9] [2,4,6..
알고리즘의 시작 정렬 알고리즘(sort Algorithm) 2. 버블 정렬 두번째 시간입니다. 오늘은 버블정렬 가지고 왔습니다. 버블정렬 버블정렬 또한 선택정렬과 같이 굉장히 직관적인 정렬 방법입니다. 바로 옆의 데이터와 비교해서 더 작은 값을 앞으로 보내자! 입니다. [2,7,4,6,8,10,5,1,3,9] 자 전 시간과 같은 데이터가 있습니다. 맨 앞의 0,1 번째 데이터를 비교하면 [2,7,4,6,8,10,5,1,3,9] 변하질 않네요 다음 1,2번째 비교하면 [2,4,7,6,8,10,5,1,3,9] [2,4,6,7,8,10,5,1,3,9] [2,4,6,7,8,10,5,1,3,9] [2,4,6,7,8,10,5,1,3,9] [2,4,6,7,8,5,10,1,3,9] . . . 이런식으로 변화하게 됩니다. 그럼 결국 첫번째 비교가 끝나면 가장 큰 값인 10이 오른쪽 끝으로 가겠..