순수 병합 정렬의 복잡도는 O(nlgn)이고 순수 삽입 정렬의 시간 복잡도는 O(n^2)입니다. 데이터의 양이 많을 때는 병합 정렬
을 사용하지만, n이 작을 때는 삽입 정렬이 더 빨리 실행될 수 있습니다. 따라서 병합 정렬에서는 하위 문제가 충분히 작아지면 삽입 정렬을 사용하여 재귀 리프를 더 두껍게 만드는 것이 정렬 속도를 높일 수 있습니다. 그렇다면 이것이 충분히 작은지 어떻게 측정합니까? 아래를 참조하세요:
증명하지는 않겠습니다. 비교적 간단합니다.
삽입 정렬은 최악의 경우 n/k 하위 목록에서 O(nk) 시간에 각 길이 k를 정렬할 수 있습니다.
B, 최악의 경우 이러한 하위 목록은 O(nlg(n/k)) 시간 내에 병합될 수 있습니다.
C, 수정된 알고리즘의 최대값 나쁜 경우 실행 시간 복잡도는 O입니다. (nk + nlg(n/k))
그러면 O(nk+nlg(n/k))=O(nlgn)은 k=O(lgn)만 가능합니다. 첫 번째 항은 방정식의 왼쪽에는 고차 항이 있습니다. k가 lgn보다 크면 병합 정렬보다 더 복잡합니다. 좌변은 nk+nlgn-nlgk로 쓸 수 있는데, k가 lgn과 같을 때 상수계수를 무시하면 병합정렬과 같다.
최종 결론: k
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|