퀵 정렬 및 귀찮게하지?


9

특히 '표준'(비 HPC) 응용 프로그램을 작성할 때 어떤 정렬 알고리즘을 선택하거나 퀵 정렬 (고속 라이브러리 (정렬이라고 부르는 것))로 정해야합니까? 어느 정도는 특정 상황에서 수익성이있을 수 있지만, 반면에 적절한 최적화는 문제를 분석하고 벤치 마크를 작성하는 데 시간이 걸립니다.

답변:


12

일반적으로보다 이국적인 무언가를 수행해야하는 특정 요구가없는 한 기본 방법을 사용하면 IMHO를 통해 모든 것을보다 읽기 / 이해할 수 있습니다.

복잡성을 추가 할 때가되는 성능 문제가있는 경우 (또는 경우에 따라 강력하게 의심)를 경험하십시오.

반면, 낮은 언어를 사용하는 경우 정렬해야 할 객체 종류에 대해 기본 제공 정렬이없는 경우 정렬해야 할 모든 기본을 포함하는 하나 또는 두 개를 선택하여 구현하십시오.


6

그렇게하지 말아야 할 아주 좋은 이유가없는 한 항상 제공된 라이브러리 루틴을 호출하십시오 ( 그 이유 를 문서화 해야 함 ).

정렬 알고리즘이 절대적으로 적합하지 않기 때문입니다. Java 퀵 정렬에는 매우 큰 데이터 세트가 포함 된 버그가있었습니다.이 데이터 세트는 Sun에 의해 식별, 수정 및 고객에게 제공되었으므로 그럴 필요가 없었습니다.

또한 Java 7의 기본 정렬이 더 새롭고 더 나은 정렬로 업그레이드되었습니다. 또한 무료로.

기본 정렬이 아니라면 라도 유용 당신을 위해 충분하지, 그것으로 스틱.


3

회의에서 나는 이것에 관한 좋은 이야기를 들었다.

Microsoft에서는 누군가 VB 앱 (c. VB 3)을 작성하고 있었고 많은 사람들에게 자신이 많은 가치를 가지고 있으며 콤보 박스에 순서대로 나타나기를 원한다고 말했습니다.

모든 사람은 오래된 컴퓨터 과학 교과서로 뛰어 들어 매우 효율적인 루틴을 찾아서 Visual Basic으로 포팅하여 그에게 우편으로 보냅니다. 한 남자가 방금 "콤보 박스에 몇 개의 값을?"

"약 50"가 답장을 받았습니다.

"정렬 된 속성을 TRUE로 설정하십시오".

99.9999 %의 인스턴스 정렬은 라이브러리 루틴과 사용자가 작성하는 것 사이의 성능 차이가 무시할 수 있고 노력 및 유지 관리 오버 헤드가 결과보다 훨씬 크기 때문에 라이브러리, 컨트롤 또는 SQL 선택을 사용하여 정렬하는 것이 가장 좋습니다.


1

조기 최적화에 대한 고전적인 인용문을 꺼내야 할 때입니다. 대부분의 경우 실제로 중요하지 않습니다. 요즘 CPU 속도로 인해 대부분의 데이터 세트를 버블 정렬 할 수 있으며 실제로별로 눈에 띄지 않을 수 있습니다. 그러나 실제로 큰 데이터 세트를 정렬 할 때 정렬 성능이 문제가되기 시작하면 다른 옵션을 반드시 살펴 봐야합니다.


버블 정렬? 성능은 평균 및 최악의 경우 최악이며 최상의 경우 삽입 정렬과 같습니다. 사용해야 할 이유가 없습니다.
Hippo

1
@Hippo : 실제로 거품 정렬을 사용하여 옹호하지 않았습니다. 현대 컴퓨터는 속도가 빠르기 때문에 대부분의 경우 사용자가 알지 못하기 때문에 알고리즘 속도가 중요하지 않습니다.
메이슨 휠러

Bogosort어떻 습니까?
dsimcha

0

분명히 비트와 타임 슬라이스에는 중요하지 않습니다. 병합 정렬보다 퀵 정렬보다 작성 및 이해가 더 쉽다는 것을 알았습니다. 따라서 자체 정렬 알고리즘을 작성하려는 경우 해당 알고리즘을 사용합니다.


비바 머지 소트! 그리고 약간 더 나은 상수항과 끔찍한 최악의 경우는 없습니다.
Frank Shearar

0

적어도 유능하게 작성된 라이브러리에서는 내장 기능 이 Quicksort가 아닌 Introsortsort 로 구현 될 것으로 기대합니다 . 그 차이는 그다지 중요하지 않지만 Introsort는 일반적인 경우에 미치는 영향을 최소화하면서 Quicksort의 최악의 최악 성능을 제거합니다.

그러나 귀하의 질문에 대답하기 위해 그렇습니다.-그것은 일반적으로 시작해야하는 것이며, 문제가 있음을 나타내는 프로파일 러 결과가있을 때까지 / 그곳에 남아 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.