예시.
mix된 1~10까지의 수를 정렬
1 6 2 8 3 4 9 5 7 10 -> 1 2 3 4 5 6 7 8 9 10
시간복잡도는
10 + 9 + 8 + ... + 1
10 (10 + 1) / 2 = 55
N (N + 1) / 2 # 컴퓨터에서는 N이 굉장히 클 수 있으니 2로 나눈 값이나, 1을 더한 값은 없앰
N * N
O(N^2) # Big O 표기법 -> 알고리즘의 총 연산 횟수.
N^2는 알고리즘에서 굉장히 비효율적인 방법
가까지에 있는 두 숫자끼리 비교해서 당장 더 작은 숫자를 앞으로 보내주는 방법
즉, 옆에 있는 값과 비교하여 더 작은 값을 반복적으로 앞으로 보내는 정렬 방법
결과적으로 한 싸이클이 돌면 가장 큰 값이 맨 오른쪽으로 이동 (정렬될 때까지 반복)
시간 복잡도 : O(N^2)
굉장히 비효율적임.
예시.
1 6 2 8 3 4 9 5 7 10
이 상태에서 6이 들어갈 수 있는 곳은
1 6 2 8 3 4 9 5 7 10
이 두군대임. (1보다 크기 때문에 오른쪽으로 Insert)
1 6 2 8 3 4 9 5 7 10
이후에 2가 들어갈 수 있는 곳은
1 6 2 8 3 4 9 5 7 10
이 세군대임. (1보다 크고 6보다 작기 때문에, 두 번째 에 들어감)
1 2 6 8 3 4 9 5 7 10
...
1 2 3 4 5 6 7 8 9 10
이렇게 다 정렬 될 때까지 반복
하나의 큰 문제를 두 개의 작은 문제로 분할하는 방법 (원소를 두 개로 나눔. pivot값 설정)
즉, 특정한 기준으로 큰 숫자와 작은 숫자를 서로 교환한 뒤에 배열을 반으로 나눔.
시간 복잡도 : O(N * logN) # 위에 있는다른 Sort와 비교했을 때 굉장히 빠른편. 왼쪽과 오른쪽을 나눠서 정렬하기 때문
다만, 최악의 경우 O(N^2)의 시간복잡도가 나올 수 있음.
하나의 문제를 정확히 반으로 나누고 나중에 정렬하는 방법
너비 = N , 높이 = logN

합치는 순간에 정렬 (i-왼쪽 데이터, j-오른쪽데이터, k-새로운배열 사용)
시간 복잡도 : O(N * logN)
다만, 기존의 데이터를 담을 추가적인 배열 공간이 필요하기 때문에, 메모리 활용이 비효율적
일반적으로 quick sort보다 느리지만, 어떠한 상황에도 O(N * logN)을 보장
https://blog.naver.com/ndb796/221228342808 - 참고
힙(Heap) 자료구조(완전 이진 트리)를 활용한 정렬 방법.
최대 힙(Max Heap)을 구성해 가장 큰 값을 루트로 만든 후, 이를 배열 끝으로 보내고 힙을 재구성하여 정렬.
힙 구성 및 정렬 과정에서 반복적으로 루트와 마지막 원소를 교환하고 힙을 재정렬함.
완전 이진 트리 -> 데이터가 root 노드부터 시작해서 왼쪽, 오른쪽 자식 노드에 데이터를 다 채우는 것
힙 -> 부모 노드가 자식 노드보다 큰 경우
자식 노드가 더 큰 경우, 부모 노드와 위치를 바꿔야 함. (이를 Heapify Algorithm 이라 부름)

예시.
