알고리즘 이렇게 어려운거였나요? ㅜ.ㅡ 초보입니다 도와주세요
헛매질
알고리즘 과제가 있어 하고 있는데 힘드네요.. c++로 작업을 하고 있는데요..
며칠째 이거만 잡고있지만 하나도 안되네요 다른 것도 공부할거 많은데 ㅜ.ㅡ 도와주세요..
정렬 알고리즘 두개를 구현해야 하는건데요..
하나는 자연합병 정렬알고리즘이구요.. 다른 하나는 토너먼트 정렬알고리즘입니다.
구글이나 네이버에서 참고할만한 소스를 찾아봐도 없네요.. ㅜ.ㅡ
어떤 식으로 구현을 해야할지 모르겠습니다.. 꼭 좀도와주세요..
두 알고리즘을 설명을 하자면 이렇습니다.
=======================================================================
1. 자연합병 정렬
배열이[9 106 7 8 34 5 1 2] 일케 있다면 이미 정렬이 되어있는 것끼리 합병한다는 의미입니다.
즉, 배열에서 이미 정렬된 [9 10] [5 6 7 8] [3 4 5] [1 2] 를 각각을 뭉탱이로 보고
두개씩 합병한다는 의미입니다. 그래서 위의 상태에서 한번 합병이 진행되면
[5 6 7 8 9 10] [1 2 3 4 5] 가 되고 한번 더 합병하면
[1 2 3 4 5 6 7 8 9 10]가 최종적으로 되어서 정렬이 된다는 의미입니다.
2. 토너먼트 정렬
스포츠에서 이긴사람이 토너먼트로 올라가는 것과 비슷한데요.. 먼저 완전이진트리를 만들고 단말노드들에 배열의 값을
전부넣습니다.그상태에서 대진표보면 16강에서 결승까지 올라가듯이 배열에서 복사한 단말노드 두개의 숫자를 비교해서
큰 수를 부모노드로복사하고 또 동일 레벨 노드들끼리 비교해서 위로 올리고를 반복합니다. 그러면 완전이진트리의
젤 위에는 배열의 원소중에서 젤 큰 숫자가 들어가게 됩니다. 그 큰 숫자는 배열중에서 젤 큰 숫자이고 방금까지의 과정을 한번
더 반복하면 그 다음으로 큰 숫자가 나오고 또 하면 또 그 다음으로 큰숫자가 나오고 이과정을 반복해서 정렬된
배열을 얻습니다.
=============================================================================
저의 문제점)
1. 자연합병정렬 : 제가 재귀함수를 구현하는게 굉장히 미흡합니다. 이거 진짜 며칠동안 해봤는데 어떻게 진행을 해야할지
모르겠습니다. 일단 이미 정렬된 런에서의 첫번째 값을 가진 배열인덱스를 기억해두었다가 하는 방법으로
해보기도 하고,런을 두개를 구한담에 합병먼저 해보려고도 해봤는데 왠지 뭔가 잘못된거같아서요..
구현을 어떤식으로 진행을 해야할까요?
2. 토너먼트 정렬 : 책에 설명은 먼저 완전이진트리를 만들고 단말노드에 배열의 값을 복사하는 게 첫단계고
두번째가 단말노드들의 값을 비교해서 부모노드에 복사하는건데요.
두번째 과정은 어떻게 해야할지 감을 잡았어요 근데 첫 번째 과정은 어떻게 해야할지 몰겠습니다.
첫번째 과정만 구현한다면 두번째는 할 수 있을 것 같습니다. 도와주세요 고수님들.. ㅜ.ㅡ
-
청식
정말 많이 써주셨네요.. 감사합니다 ㅜ.ㅡ 이제 남은 건 제 몫인것 같네요 ㅎㅎ 진짜 해보이겠습니닷!!
-
후력
아침부터 회사에서 먼짓을 하는지-_-;; 써놓고 보니 그닥 도움은 안될 것 같지만.. 생각하시는데 조금이라도 도움이 되었다면 좋겠네요.
-
목소리
push 기능은 left - right 순으로 집어 넣으면 되는데 full binary tree 이므로 현재 depth 를 반영하여 쭈욱 넣으면 되겠죠. 현재 depth 에서 넣을 수 있는 node 의 한계에 도달하면 depth 가 하나 늘면서 아래 줄에 노드들을 붙이면 되구요.
-
큰맘
1. node 를 만듭니다. 이 node 는 배열의 값을 넣을 수 있고 초기화시 parent, left/right child 가 null 이 되어야 겠지요. 2. full binary tree 를 만듭니다. 이 tree 는 root node 를 가지고 있습니다. 3. tree 에 push 하는 기능을 넣습니다.
-
찬바리
2번 정렬의 경우, 완전이진트리를 만들고 복사하는 부분이요, 일딴 1개의 parent 와 두개의 child(left, right child) 를 가지는 node 를 만들고 이 node 에 배열의 값을 순차적으로 집어 넣으면서 tree 에 push 하시면 될 것 같은데요.. 최대한 간단하게 생각하시고 하나씩 기능을 구현하시면 ;;
-
연와인
즉, 버블 소팅에서 숫자의 크기를 비교하는 비교 부분만 뭉탱이의 순위를 가리는 비교로 바꾸면 정렬이 가능해진다는 것입니다. 정리하면, 1회 스캔하여 연속된 숫자들의 집합을 분리하고 각 집합을 정렬한다.. 정도가 되겠네요.
-
온새미로
일반적인 숫자열이 있고 이미 정렬된 녀석들은 정렬할 필요가 없다는 전제라면.. 연결된 숫자들을 뭉탱으로 정리하여 각 뭉탱이가 가지고 있는 앞/뒤의 숫자만 가지고 정렬할 수 있습니다. 단순히 버블을 사용하거나.. 원하는 알고리즘을 사용해서요..
-
옆집언니야
일딴.. 1번 정렬의 경우 문제가 좀 있는 것 같습니다.. 무엇인고 하니.. 과연 숫자가 [9 10] [5 6 7 8] [3 4 5] [1 2] 요런식으로 순진하게 있느냐 하는 것인데.. [5 6 7 8] [3 4 5] [1 2] [9 10] 요렇게 있으면 말씀하신 방식의 정렬에 문제가 발생합니다. 즉, 2번에 정렬 안됩니다. 이걸 2번에 정렬하느냐.. 아니냐에 따라서 또 구현 방식이 달라질 것 같은데요..