트리 정렬(Tree Sort)
정렬되지 않은 원소들을 이진 탐색 트리(왼쪽 자식 노드에는 자신보다 작은, 오른쪽 자식 노드에는 자신보다 큰 값인 이진 트리)로 구성한 후 중위 순회 방법(현재 노드의 왼쪽 서브 트리로 이동 -> 현재 노드 -> 현재 노드의 오른쪽 서브 트리로 이동)으로 순회하면서 오름차순으로 정렬한다.
시간 복잡도는 O(nlog2n)이다.
예시)
{57, 16, 41, 2, 50, 6, 32, 27}
1. 이진 탐색 트리로 구성
57
/
27
/\
6 41
/\. /\
2 16 32 50
2. 중위 순회 방법으로 오름차순 정렬
{2, 6, 16, 27, 32, 41, 50, 57}
프로그램 작성)
package test;
class TreeNode {
int data;
TreeNode left;
TreeNode right;
}
class BinarySearchTree {
private TreeNode root = null;
public TreeNode insertKey(TreeNode root, int x) {
TreeNode p = root;
TreeNode newNode = new TreeNode();
newNode.data = x;
newNode.left = null;
newNode.right = null;
if(p == null) {
return newNode;
} else if(newNode.data < p.data) {
p.left = insertKey(p.left, x);
return p;
} else if(newNode.data > p.data) {
p.right = insertKey(p.right, x);
return p;
} else {
return p;
}
}
public void insertBST(int x) {
root = insertKey(root, x);
}
public void inorder(TreeNode root) {
if(root != null) {
inorder(root.left);
System.out.print(" " + root.data);
inorder(root.right);
}
}
public void printBST() {
System.out.println("중위 순회 : ");
inorder(root);
}
}
class Sort {
BinarySearchTree bst = new BinarySearchTree();
public void treeSort(int[] a) {
for(int i=0; i<a.length; i++) {
bst.insertBST(a[i]);
}
bst.printBST();
}
}
public class Test {
public static void main(String[] args) {
int a[] = {57, 16, 41, 2, 50, 6, 32, 27};
System.out.println("정렬 전 원소 : ");
for(int i=0; i<a.length; i++) {
System.out.printf(" %d", a[i]);
}
System.out.println();
Sort s = new Sort();
s.treeSort(a);
}
}
실행 결과)
'정렬' 카테고리의 다른 글
힙 정렬(Heap Sort) (0) | 2021.04.02 |
---|---|
기수 정렬(Radix Sort) (0) | 2021.04.02 |
병합 정렬(Merge Sort) (0) | 2021.04.02 |
셸 정렬(Shell Sort) (0) | 2021.04.02 |
삽입 정렬(Insert Sort) (0) | 2021.04.02 |