>  기사  >  웹 프론트엔드  >  빠른 정렬 알고리즘 크래킹: 몇 분 안에 이론에서 실습까지

빠른 정렬 알고리즘 크래킹: 몇 분 안에 이론에서 실습까지

Susan Sarandon
Susan Sarandon원래의
2024-11-07 09:29:02360검색

Quicksort는 가장 빠른 정렬 알고리즘 중 하나입니다. 값 배열을 사용하고 값 중 하나를 '피벗' 요소로 선택한 다음 낮은 값이 피벗 요소 왼쪽에 있고 높은 값이 오른쪽에 있도록 다른 값을 이동합니다.

빠른 정렬은 알고리즘 세계에서 가장 우아하고 효율적인 정렬 알고리즘 중 하나입니다. Bubble Sort 또는 Selection Sort와 같은 단순한 알고리즘과 달리 Quick Sort는 실제로 훨씬 빠른 속도를 제공하는 정교한 분할 정복 전략을 사용합니다. 병합 정렬도 분할 정복을 사용하지만 Quick Sort의 고유한 분할 접근 방식은 종종 더 나은 성능과 메모리 사용으로 이어집니다.

평균 시간 복잡도: O(n log n)

최악의 경우 시간 복잡도: O(n²)

공간 복잡도: O(log n)

목차

  1. 퀵 정렬 알고리즘이란
  2. 빠른 정렬은 어떻게 작동하나요?
    • 시간복잡도
    • 공간 복잡도
  3. 자바스크립트 구현
  4. 결론

퀵 정렬 알고리즘이란?

빠른 정렬은 배열에서 '피벗' 요소를 선택하고 다른 요소가 피벗보다 작거나 큰지 여부에 따라 두 개의 하위 배열로 분할하여 작동하는 매우 효율적인 정렬 알고리즘입니다. 먼저 나누고 나중에 결합하는 병합 정렬과 달리 퀵 정렬은 파티셔닝 과정에서 정렬을 수행합니다.

다른 정렬 알고리즘과의 비교를 고려해보세요.

Algorithm Time Complexity (Average) Space Complexity In-Place?
Quick Sort O(n log n) O(log n) Yes
Merge Sort O(n log n) O(n) No
Bubble Sort O(n²) O(1) Yes
Selection Sort O(n²) O(1) Yes
Heap Sort O(n log n) O(1) Yes

빠른 정렬은 어떻게 작동하나요?

빠른 정렬 알고리즘의 JavaScript 구현에 대해 알아보기 전에 간단한 4단계를 통해 간단한 숫자 배열을 수동으로 정렬하여 알고리즘의 작동 방식을 이해하는 단계별 접근 방식을 살펴보겠습니다.

빠른 정렬은 네 가지 간단한 단계로 나눌 수 있습니다.

  1. 배열에서 피벗 요소를 선택합니다. 이 요소는 목록/배열의 첫 번째, 마지막, 중간 또는 임의의 요소일 수 있습니다.
  2. 피벗보다 작은 요소는 모두 왼쪽에, 더 큰 요소는 모두 오른쪽에 있도록 배열을 다시 정렬하세요.
  3. 피벗이 중앙에 오도록 피벗 요소를 더 큰 값의 첫 번째 요소로 바꿉니다.
  4. 피벗 왼쪽과 오른쪽의 하위 배열에 동일한 작업을 반복적으로 적용합니다.

이 단계를 실제 배열에 적용해 보겠습니다. 할까요?

Cracking Quick Sort algorithm: From Theory to Practice in Minutes

초기 배열: [3, 6, 2, 7, 1]

1단계: 피벗 선택

  • 단순화를 위해 마지막 요소를 피벗으로 선택합니다.
  • 피벗 = 1

2단계: 피벗 주위에 배열 재배치

  • 피벗(1)보다 작은 모든 요소가 왼쪽에 있고 더 큰 모든 요소가 오른쪽에 있도록 재정렬합니다.
  • 각 요소를 살펴보면 다음과 같습니다.
    • 3(1보다 큼) → 오른쪽에 유지됩니다.
    • 6(1보다 큼) → 오른쪽에 유지됩니다.
    • 2(1보다 큼) → 오른쪽에 유지됩니다.
    • 7(1보다 큼) → 오른쪽에 유지됩니다.
  • 재배열된 배열: [1, 6, 2, 7, 3]

3단계: 피벗을 올바른 위치로 바꾸기

  • 피벗(1)을 그보다 큰 첫 번째 요소인 6으로 바꿉니다.
  • 교체 후 배열: [1, 3, 2, 7, 6]
  • 이제 1이 올바른 위치(색인 0)에 있습니다.

4단계: 하위 배열의 재귀적 빠른 정렬

  • 왼쪽 하위 배열: [](1보다 왼쪽 요소가 없으므로 여기서 정렬할 항목이 없음)
  • 오른쪽 하위 배열: [3, 2, 7, 6]

오른쪽 하위 배열 [3, 2, 7, 6]을 재귀적으로 정렬

1단계: 피벗 선택

  • 피벗 = 6(마지막 요소)

2단계: 피벗 주위에 배열 재배치

  • 6보다 작은 요소는 왼쪽에, 큰 요소는 오른쪽에 정렬합니다.
    • 3(6개 미만) → 왼쪽에 유지됩니다.
    • 2(6개 미만) → 왼쪽에 유지됩니다.
    • 7(6보다 큼) → 오른쪽에 유지됩니다.
  • 재배열된 배열: [3, 2, 6, 7]

3단계: 피벗을 올바른 위치로 바꾸기

  • 6은 이미 올바른 위치(색인 2)에 있습니다.
  • 배열: [1, 3, 2, 6, 7]

4단계: 하위 배열의 재귀적 빠른 정렬

  • 왼쪽 하위 배열: [3, 2]
  • 오른쪽 하위 배열: [7](단일 요소, ​​정렬 필요 없음)

왼쪽 하위 배열 정렬 [3, 2]

1단계: 피벗 선택

  • 피벗 = 2(마지막 요소)

2단계: 피벗 주위에 배열 재배치

  • 2보다 작은 요소가 왼쪽에 오도록 재정렬합니다.
    • 3(2보다 큼) → 오른쪽에 유지됩니다.
  • 재배열된 배열: [2, 3]

3단계: 피벗을 올바른 위치로 바꾸기

  • 2는 이미 올바른 위치(색인 1)에 있습니다.
  • 배열: [1, 2, 3, 6, 7]

4단계: 하위 배열의 재귀적 빠른 정렬

  • 왼쪽 하위 배열: [](요소 없음)
  • 오른쪽 하위 배열: [3](단일 요소, ​​정렬 필요 없음)

최종 정렬된 배열

모든 하위 배열을 정렬한 후 최종 정렬된 배열을 얻습니다.

정렬된 배열: [1, 2, 3, 6, 7]

다음은 이것이 실제 생활에서 어떻게 작동하는지 보여주는 최고의 그림입니다.

Cracking Quick Sort algorithm: From Theory to Practice in Minutes

시간 복잡도

빠른 정렬의 시간 복잡도는 피벗 선택에 따라 다릅니다.

  • 최상의 경우(O(n log n)):

    • 피벗이 항상 배열을 동일한 절반으로 나눌 때 발생합니다
    • Merge Sort의 성능과 유사
  • 평균 사례(O(n log n)):

    • 가장 실용적인 시나리오
    • 캐시 활용도가 높아 병합 정렬보다 우수함
  • 최악의 경우(O(n²)):

    • 이미 정렬된 배열과 잘못된 피벗 선택으로 발생합니다
    • 좋은 피벗 선택 전략으로 피할 수 있음

공간 복잡도

Quick Sort의 공간 복잡도는 다음과 같은 이유로 O(log n)입니다.

  • 재귀 호출 스택 깊이
  • 내부 파티셔닝(Merge Sort의 O(n) 추가 공간과 다름)
  • 병합 정렬에 비해 메모리 효율성이 더 좋습니다

자바스크립트 구현

function quickSort(arr) {
  // Base case: arrays with length 0 or 1 are already sorted
  if (arr.length <= 1) return arr;

  // Helper function to swap elements
  const swap = (i, j) => {
    [arr[i], arr[j]] = [arr[j], arr[i]];
  };

  // Partition function using Lomuto's partition scheme
  function partition(low, high) {
    const pivot = arr[high];
    let i = low - 1;

    for (let j = low; j < high; j++) {
      if (arr[j] <= pivot) {
        i++;
        swap(i, j);
      }
    }
    swap(i + 1, high);
    return i + 1;
  }

  // Main quickSort function implementation
  function quickSortHelper(low, high) {
    if (low < high) {
      const pivotIndex = partition(low, high);
      quickSortHelper(low, pivotIndex - 1); // Sort left side
      quickSortHelper(pivotIndex + 1, high); // Sort right side
    }
  }

  quickSortHelper(0, arr.length - 1);
  return arr;
}

결론

빠른 정렬은 효율성과 내부 정렬로 인해 인기 있는 선택입니다. O(n log n) 평균 사례 성능과 낮은 공간 복잡성으로 버블 정렬 및 선택 정렬과 같은 간단한 알고리즘보다 성능이 뛰어납니다.

주요 내용:

  1. 피벗 선택 전략을 신중하게 선택하세요
  2. Quick Sort와 다른 알고리즘 중에서 선택할 때 입력 특성을 고려하세요
  3. 더 나은 평균 사례 성능을 위해 무작위 피벗 선택 사용


최신 소식과 연결 상태를 유지하세요

이 시리즈의 모든 부분을 놓치지 않도록 하고 저와 더 깊이 있게 소통하기 위해
소프트웨어 개발(웹, 서버, 모바일 또는 스크래핑/자동화), 데이터에 대한 토론
구조와 알고리즘, 기타 흥미로운 기술 주제에 대해 알아보려면 저를 팔로우하세요.

Cracking Quick Sort algorithm: From Theory to Practice in Minutes

에마누엘 아인데

소프트웨어 엔지니어 | 기술 작가 | 백엔드, 웹 및 모바일 개발자 ? | 효율적이고 확장 가능한 소프트웨어 솔루션 제작에 열정을 갖고 있습니다. #연결하자 ?
  • 깃허브
  • 링크드인
  • 엑스(트위터)

앞으로 계속 지켜봐 주시기 바랍니다. 즐거운 코딩 되세요 ?‍??

위 내용은 빠른 정렬 알고리즘 크래킹: 몇 분 안에 이론에서 실습까지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.