수 정렬하기 2 - 시간복잡도 O(nlogn)
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
예제 입력 1 복사
5
5
4
3
2
1
예제 출력 1 복사
1
2
3
4
5
mergeSort 이용
#mergeSort
#PYPY3로 제출
def mergeSort(arr):
#1과정
if len(arr) > 1:
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:] # left right로 나누기
mergeSort(left)
mergeSort(right) #결국 left right에 하나의 원소 씩만 남을 때까지 mergeSort
i, j, k = 0, 0, 0
#2과정
while i < len(left) and j < len(right): # left와 right의 길이가 0보다 큰 동안
# left[i]와 right[i] 중에 더 작은 수를 arr[k](arr의 맨 앞부터) 저장
if left[i] < right[j]:
arr[k] = left[i]
i += 1
else:
arr[k] = right[j]
j += 1
k += 1
#3과정
while i < len(left):
arr[k] = left[i]
i += 1
k += 1
while j < len(right):
arr[k] = right[j]
j += 1
k += 1
return arr
N = int(input())
nums = []
for _ in range(N):
nums.append(int(input()))
mergeSort(nums)
for i in nums:
print(i)
left = [ 15 20 ]
right = [ 5 26 ]
일 때
#2과정과 #3과정의 진행 방식
'CS 공부 > 알고리즘' 카테고리의 다른 글
Recursion - 백준 10870: 피보나치 수 5 (0) | 2022.12.30 |
---|---|
Recursion - 백준 10872: 팩토리얼 (0) | 2022.12.27 |
Sort - 백준 25305번: 커트라인 (0) | 2022.11.17 |
Sort - 백준 2587번: 대푯값2 (0) | 2022.11.17 |
Sort _ 백준 2750번 문제 (0) | 2022.11.16 |
댓글