오늘 면접관님이 즉석에서 퀵소트를 작성해 달라고 하셨습니다. 현장은 다음과 같습니다.
인터뷰어: 계속해서 데이터 구조와 알고리즘에 대해 이야기해 주실 수 있나요? (말하면서 이력서를 넘기더니 펜을 건넸다. 이력서 뒷면에 써달라는 뜻이었다.)
루키나: 무슨 말이야? 여기에 쓰시겠어요? (이력서를 가리키며)
면접관: 응
신입 나: 아니
면접관: 자, 오늘 면접은 여기까지
신입 나: (너무 화가 나요. 노사에 고발하고 싶어요. 코드를 재개하시겠습니까? 그냥 쓰세요, 어차피 종이 한 장일 뿐입니다.
사실 퀵큐는 쉽지만 손으로 못쓰는 분들도 많을 것 같은데요, 여러모로 그 자리에서 손으로 쓰는 분들도 많죠?
초보인데 아직 손으로 쓸 수 있거든요. 결국 인터뷰 전에는 일부러 "빠른 받아쓰기
"를 준비했어요. 이제 분석하고 분석해 봅시다 ---- 퀵 정렬.
Background
빠른 정렬은 1962년 C. A. R. Hoare에 의해 제안되었습니다. 기본 아이디어는 한 번의 정렬을 통해 정렬할 데이터를 두 개의 독립적인 부분으로 나눈 다음, 이 방법을 사용하여 데이터의 두 부분을 빠르게 분리하는 것입니다. . 정렬은 전체 정렬 프로세스를 [재귀적으로] 수행하여 전체 데이터가 정렬된 시퀀스가 되도록 할 수 있습니다.
이 개념을 이해하는 것은 꽤 어렵습니다.
다음과 같이 이해될 수 있습니다.
퀵 정렬은 버블 정렬의 향상된 버전입니다. 전체 프로세스는 항목을 제거하고 패치하고, 찢고, 패치하고, 찢고 패치하는 것입니다. 모든 요소는 정렬된 상태에 도달합니다.
핵심 아이디어:
먼저 시퀀스에서 숫자를 기본 숫자로 가져온 다음 크기 분할을 수행합니다.
파티션 프로세스에서 이 숫자보다 큰 숫자는 모두 오른쪽에 배치되고, 그보다 작은 숫자는 오른쪽에 배치됩니다. 또는 그와 같으면 모두 왼쪽에 놓습니다.
각 간격에 하나의 숫자만 있을 때까지 왼쪽 및 오른쪽 간격에 대해 두 번째 단계를 반복하고 정렬이 완료됩니다.
사진과 글을 통해 차근차근 분해해보겠습니다.
이 배열을 [4,1,6,2,9,3]
예로 들어보세요.
첫 번째 패스:
현재 배열 순서는 [3, 1, 2, 4, 9, 6].
다음 단계:
오른쪽도 마찬가지입니다... 시각적인 것은 피하세요 피로도를 하나씩 설명하지는 않겠지만 아래 동적 시연 사진을 보시면 됩니다.
[1, 2, 3, 4, 6, 9]
코드 구현, 이해하기 쉽도록 이전 애니메이션과 결합하는 것이 좋습니다.
퀵 정렬을 작성하는 방법에는 여러 가지가 있습니다. 관심이 있으시면 Wikipedia에서 퀵 정렬이 어떻게 소개되는지 직접 찾아보실 수도 있습니다.
시간 복잡도:
최악의 시나리오는 매번 검색되는 요소가 배열에서 가장 작거나 가장 큰 요소라는 것입니다. 한 요소씩 순서대로 정렬)
이 경우 시간 복잡도는 쉽게 계산할 수 있는데, 이는 버블 정렬의 시간 복잡도입니다. T[n] = n * (n-1) = n^2 + n ;
가장 좋은 경우는 O(nlog2n)이며, 도출 과정은 다음과 같습니다:
(재귀 알고리즘의 시간 복잡도 공식: T[n] = aT[n/b] + f(n) )
https://img2018.cnblogs.com/blog/1258817/201903/1258817-20190326191158640-601403776.png
그래서 평균 시간 복잡도는 O(nlog2n)
공간 복잡성:
공간 퀵 정렬에서 사용하는 것은 상수 수준인 O(1)이며 실제로 공간을 소비하는 것은 재귀 호출입니다. 각 재귀는 일부 데이터를 유지해야 하기 때문입니다.
최적의 경우 공간 복잡성은 다음과 같습니다. O(log2n ); 그룹이 매번 동일하게 분할되는 경우
최악의 공간 복잡도는 O(n) 버블 정렬의 경우로 변질됩니다
그러므로 평균 공간 복잡도는 O(log2n)
위 내용은 메이투안 인터뷰: 빠른 일정을 손으로 써주세요. 깜짝 놀랐습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!