숫자 목록을 정렬해야하지만 매우 게으르다. 모든 숫자가 오름차순이 될 때까지 모든 숫자를 바꾸는 방법을 이해하는 것은 정말 어렵 기 때문에 새로운 목록이 정렬되도록 보장하는 자체 알고리즘을 만들었습니다 ¹. 작동 방식은 다음과 같습니다.
크기 N 의 목록을 보려면 N-1 반복 이 필요합니다 . 반복 할 때마다
N 번째 숫자가 N + 1 번째 숫자보다 작은 지 확인하십시오 . 그렇다면이 두 숫자는 이미 정렬 된 것이므로이 반복을 건너 뛸 수 있습니다.
그렇지 않은 경우이 두 숫자가 순서가 될 때까지 첫 번째 N 숫자 를 계속 감소시켜야합니다 .
구체적인 예를 들어 봅시다. 입력이
10 5 7 6 1
첫 번째 반복에서는 10과 5를 비교합니다. 10은 5보다 크므로 작을 때까지 줄입니다.
4 5 7 6 1
이제 우리는 5와 7을 비교합니다. 5는 7보다 작으므로이 반복에 대해 아무 것도 할 필요가 없습니다. 그래서 우리는 다음으로 가서 7과 6을 비교합니다. 7은 6보다 큽니다. 그래서 우리는 6보다 작을 때까지 처음 세 숫자를 줄입니다.
2 3 5 6 1
이제 6과 1을 비교합니다. 다시 6은 1보다 큽니다. 따라서 첫 4 개의 숫자가 1보다 작을 때까지 감소하면 다음과 같이됩니다.
-4 -3 -1 0 1
그리고 우리는 끝났습니다! 이제 우리의 목록은 완벽하게 정렬 된 순서입니다. 그리고 일을 더 잘하기 위해 우리는 N-1 번의 목록을 반복 해야 했으므로이 알고리즘은 O (N-1) 시간으로 목록을 정렬하므로 가장 빠른 알고리즘이 확실합니다 .²
오늘 당신의 도전은이 지연 정렬을 구현하는 것입니다. 프로그램이나 함수에는 원하는 표준 형식의 정수 배열이 제공되며이 지연 정렬을 수행하고 새로운 "정렬 된" 목록을 반환해야 합니다. 배열은 절대 비어 있거나 정수가 아닙니다.
여기 몇 가지 예가 있어요.
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
항상 그렇듯이 이것은 code-golf 이므로 가능한 가장 짧은 프로그램을 작성하십시오!
¹ 이것이 의미하는 것처럼 들리는 것은 아니지만 기술적으로 사실입니다.
² 난 농담이야, 제발 날 미워 하지마
<sarcasm>
이 정렬 알고리즘은 실제로 O(N^2)
목록에서 이전에 액세스 한 항목을 모두 줄여야하기 때문에 시간 복잡도 에 여전히 영향 을 미칩니다. 대신 목록을 거꾸로 살펴보고 필요한 경우 단계 당 하나의 숫자 만 줄이는 것이 좋습니다 . 이것은 당신에게 진정한 O(N)
복잡성 을 줄 것입니다 ! </sarcasm>
O(n^2)
메모리 액세스 측면에서 @ValueInk 이지만 O(n)
비교 용이 아닙니까?
O(N^2)
.