선택이 버블 정렬보다 빠른 이유는 무엇입니까?


28

위키 피 디아에 작성 "... 선택은 일종의 거의 항상 일종의 거품과 그놈 종류 능가."고 둘 다 가지고 있지만 선택 정렬이 버블 정렬보다 빠른 것으로 간주되는 이유를 누구에게나 설명해 줄 수 있습니까?

  1. 최악의 시간 복잡도 : O(n2)

  2. 비교 횟수 : O(n2)

  3. 최고의 시간 복잡성 :

    • 버블 정렬 :O(n)
    • 선택 정렬 :O(n2)
  4. 평균 사례 시간 복잡성 :

    • 버블 정렬 :O(n2)
    • 선택 정렬 :O(n2)

답변:


32

제공 한 모든 복잡도는 사실이지만 Big O 표기법으로 표시 되므로 모든 추가 값과 상수는 생략됩니다.

귀하의 질문에 대답하기 위해 우리는이 두 알고리즘의 상세한 분석에 중점을 둘 필요가 있습니다. 이 분석은 손으로 수행하거나 많은 책에서 찾을 수 있습니다. Knuth 's Art of Computer Programming의 결과를 사용하겠습니다 .

평균 비교 횟수 :

  • 버블 정렬 : 12(N2NlnN(γ+ln21)N)+O(N)
  • 삽입 정렬 : 14(N2N)+NHN
  • 선택 정렬 : (N+1)HN2N

이제 이러한 함수를 플로팅하면 다음과 같은 결과가 나타납니다. 음모 plot2

보시다시피, 두 가지 정렬 방법이 동일한 점근 적 복잡성을 갖더라도 요소의 수가 증가함에 따라 기포 정렬이 훨씬 더 나쁩니다.

이 분석은 입력이 임의적이라는 가정을 기반으로하며 항상 사실이 아닐 수도 있습니다. 그러나 정렬을 시작하기 전에 임의의 방법을 사용하여 입력 시퀀스를 무작위로 치환하여 평균 사례를 얻을 수 있습니다.

구현에 따라 시간 복잡성 분석을 생략했지만 비슷한 방법을 사용할 수 있습니다.


"입력 시퀀스를 무작위로 치환하여 평균값을 얻을 수 있습니다"라는 문제가 있습니다. 왜 정렬 시간보다 더 빨리 할 수 ​​있습니까?
Sasho Nikolov

1
N 은 시퀀스 길이 인 시간 이 걸리는 모든 시퀀스를 순열 할 수 있습니다 . 그것은 정렬 알고리즘을 기반으로 모든 comparation 적어도이 있어야 분명 O ( N 로그 N ) 그래서 심지어 당신이 추가하면 복잡성을 N을영형(로그) 을 복잡도는 크게 변경되지 않습니다. 어쨌든 우리는 시간에 관한 것이 아니라 비교에 대해 이야기하고 있습니다. 시간 복잡성은 구현과 실행중인 기계에 달려 있습니다.
Bartosz Przybylski

나는 졸린 것 같아요, 당신 말이 맞아요, 시퀀스는 선형 시간으로 바꿀 수 있습니다.
Sasho Nikolov

H N = Θ ( l o g N ) 이므로HN=Θ(logN) 비교가 선택 정렬에 적합합니까? 평균적으로 O (n log n) 비교를한다는 것을 암시하는 것처럼 보입니다.
templatetypedef

감마 = 0.577216은 오일러-마스 체로 니 상수입니다. 관련 장은 "The Art of Programming"vol 3 section 5.2.2 pg입니다. 109 and 129. 거품 정렬 사례를 정확히 특히 O (sqrt (N)) 항을 어떻게 플롯 했습니까? 방금 방치 했습니까?
mxmlnkn

11

O

함수 자체, 예를 들어 비교 및 ​​/ 또는 스왑 수는 동일한 속도로 성장하는 경우 동일한 점근 비용을 가진 두 알고리즘에 대해 다를 수 있습니다.

보다 구체적으로 말하면, 버블 정렬에는 평균적으로 /41

케이×케이/2(1)×(2)/2

요약하면 점근 적 한계는 입력 크기와 관련하여 알고리즘 비용이 어떻게 증가하는지에 대한 좋은 느낌을 주지만 동일한 세트 내에서 다른 알고리즘의 상대적인 성능에 대해서는 아무 말도하지 않습니다.


1
이것은 아주 좋은 답변입니다
Grijesh Chauhan

어떤 책을 선호하십니까?
Grijesh Chauhan

@GrijeshChauhan : 책은 맛의 문제이므로 소금 한 알갱이로 권장 사항을 가져 가십시오. 저는 개인적으로 Cormen, Leiserson 및 Rivest의 "Introduction to Algorithms"를 좋아합니다. 여기에는 여러 가지 주제에 대한 좋은 개요와 특정 주제에 대한 자세한 내용이 필요한 경우 Knuth의 "컴퓨터 프로그래밍 기술"시리즈가 있습니다. 책의 질문이 전에 여기에 요청되었는지 확인하거나 그렇지 않은 경우 해당 질문을 게시 할 수 있습니다.
페드로

나를 위해, 당신의 대답의 세 번째 파라는 실제 답변입니다. 다른 답변에서 주어진 큰 입력에 대한 그래프가 아닙니다.
overexchange

3

버블 정렬은 더 많은 스왑 시간을 사용하지만 선택 정렬은이를 피합니다.

정렬 선택을 사용하면 n대부분 시간 이 바뀝니다 . 그러나 버블 정렬을 사용하면 거의 교체됩니다 n*(n-1). 그리고 분명히 읽기 시간은 메모리에서도 쓰기 시간보다 짧습니다. 비교 시간 및 기타 실행 시간은 무시할 수 있습니다. 따라서 스왑 시간은 문제의 중요한 병목 현상입니다.


나는 Bartek의 다른 대답이 더 합리적이라고 생각하지만 투표하거나 의견을 말할 수 없습니다 ... BTW 여전히 글쓰기 시간이 더 큰 영향을 미친다고 생각하고 그가 이것을보고 동의하면 이것을 고려할 수 있기를 바랍니다.
simonmysun

두 항목을 비교하는 데 소요되는 시간이 두 항목을 교체하는 데 소요되는 시간을 훨씬 초과 할 수있는 유스 케이스가 있으므로 비교 수를 무시할 수는 없습니다. 매우 긴 문자열 (각각 100k 문자)의 링크 된 목록을 고려하십시오. 각 문자열을 읽는 것은 포인터를 다시 할당하는 것보다 훨씬 오래 걸립니다.
Irvin Lim

@ IrvinLim 나는 당신이 옳다고 생각하지만 내 마음을 바꾸기 전에 통계 데이터를보아야 할 수도 있습니다.
simonmysun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.