빠른 정렬 알고리즘 이해

    이 자습서에서는 빠른 정렬의 작동 방식을 배웁니다. 또한 C 언어를 사용한 예제를 찾을 수 있습니다.
    Quicksort는 나누기 및 정복 방법을 기반으로하는 알고리즘으로 배열을 하위 배열로 나누고 이러한 하위 배열을 재귀 적으로 호출하여 요소를 정렬합니다.

빠른 정렬 알고리즘은 어떻게 작동합니까?
  1. 배열에서 피벗 요소를 선택합니다. 배열의 모든 요소를 ​​피벗 요소로 선택할 수 있습니다.
    여기서는 배열의 가장 오른쪽 (즉, 마지막 요소)을 피벗 요소로 사용합니다.
    여기에 사진 설명 삽입

  2. 피벗 요소보다 작은 요소는 왼쪽에 배치되고 피벗 요소보다 큰 요소는 오른쪽에 배치됩니다.
    여기에 사진 설명 삽입
    위의 배열은 다음 단계를 통해 이루어집니다.
    포인터는 축 요소에 고정됩니다. 피벗 요소는 첫 번째 인덱스로 표시된 요소와 비교됩니다. 요소가 피벗 요소보다 크면 두 번째 포인터가 요소를 가리 킵니다.
    b. 이제 피벗 요소가 다른 요소 (세 번째 포인터)와 비교됩니다. 현재 요소가 피벗 요소보다 작 으면 더 작은 요소가 이전에 발견 된 더 큰 요소로 교체됩니다.
    여기에 사진 설명 삽입
    c.이 프로세스는 마지막 요소까지 계속됩니다.
    마지막으로 피벗 요소가 두 번째 포인터로 바뀝니다.
    여기에 사진 설명 삽입
    d. 이제이 축 요소의 왼쪽 및 오른쪽 하위 부분이 다음 단계에서 추가로 처리됩니다.

  3. 다시 왼쪽 및 오른쪽 하위 섹션에 대한 피벗 요소를 각각 선택합니다. 이 하위 섹션에서 피벗 요소는 올바른 위치에 배치됩니다. 그런 다음 2 단계를 반복합니다.
    여기에 사진 설명 삽입

  4. 하위 섹션은 각 하위 섹션이 단일 요소로 구성 될 때까지 다시 작은 하위 섹션으로 나뉩니다.

  5. 이 시점에서 배열이 정렬되었습니다.

빠른 정렬은 재귀를 사용하여 하위 섹션을 정렬합니다.

    분할 및 정복 방법에 따라 빠른 정렬 알고리즘은 다음과 같이 설명 할 수 있습니다.

  • 분할
    축은 분할 지점이고 배열은 여러 하위 부분으로 나뉩니다. 축보다 작은 요소는 축의 왼쪽에 배치되고 축보다 큰 요소는 축의 오른쪽에 배치됩니다.
  • 컨트롤
    분할 및 왼쪽 및 오른쪽 하위 부분에 대한 축 요소를 선택하여 다시 정복하십시오. 이는 하위 부분을 알고리즘에 재귀 적으로 전달함으로써 달성 할 수 있습니다.
  • 조합
    이 단계는 빠른 정렬에서 중요한 역할을하지 않습니다. 제어 단계가 끝날 때 배열이 정렬되었습니다.

    아래 그림을 통해 빠른 정렬의 작동 방식을 이해할 수 있습니다.
여기에 사진 설명 삽입
    재귀를 사용하여 피벗 요소의 왼쪽에있는 요소
여기에 사진 설명 삽입
    를 정렬합니다. 재귀를 사용 하여 피벗 요소 의 오른쪽에있는 요소를 정렬합니다.

빠른 정렬 알고리즘 의사 코드
quickSort(array, leftmostIndex, rightmostIndex)
  if (leftmostIndex < rightmostIndex)
    pivotIndex <- partition(array,leftmostIndex, rightmostIndex)
    quickSort(array, leftmostIndex, pivotIndex)
    quickSort(array, pivotIndex + 1, rightmostIndex)

partition(array, leftmostIndex, rightmostIndex)
  set rightmostIndex as pivotIndex
  storeIndex <- leftmostIndex - 1
  for i <- leftmostIndex + 1 to rightmostIndex
  if element[i] < pivotElement
    swap element[i] and element[storeIndex]
    storeIndex++
  swap pivotElement and element[storeIndex+1]
return storeIndex + 1
C 예
// Quick sort in C

#include <stdio.h>

// Function to swap position of elements
void swap(int *a, int *b) {
    
    
  int t = *a;
  *a = *b;
  *b = t;
}

// Function to partition the array on the basis of pivot element
int partition(int array[], int low, int high) {
    
    
  
  // Select the pivot element
  int pivot = array[high];
  int i = (low - 1);

  // Put the elements smaller than pivot on the left 
  // and greater than pivot on the right of pivot
  for (int j = low; j < high; j++) {
    
    
    if (array[j] <= pivot) {
    
    
      i++;
      swap(&array[i], &array[j]);
    }
  }

  swap(&array[i + 1], &array[high]);
  return (i + 1);
}

void quickSort(int array[], int low, int high) {
    
    
  if (low < high) {
    
    
    
    // Select pivot position and put all the elements smaller 
    // than pivot on left and greater than pivot on right
    int pi = partition(array, low, high);
    
    // Sort the elements on the left of pivot
    quickSort(array, low, pi - 1);
    
    // Sort the elements on the right of pivot
    quickSort(array, pi + 1, high);
  }
}

// Function to print eklements of an array
void printArray(int array[], int size) {
    
    
  for (int i = 0; i < size; ++i) {
    
    
    printf("%d  ", array[i]);
  }
  printf("\n");
}

// Driver code
int main() {
    
    
  int data[] = {
    
    8, 7, 2, 1, 0, 9, 6};
  int n = sizeof(data) / sizeof(data[0]);
  quickSort(data, 0, n - 1);
  printf("Sorted array in ascending order: \n");
  printArray(data, n);
}
Quicksort의 복잡성

    시간 복잡성

  • 최악의 경우 복잡성 [Big-O] : O ( n 2 n ^ 22 )
    선택한 축 요소가 최대 또는 최소 요소 일 때 발생합니다.
    이러한 상황으로 인해 피벗 요소가 정렬 된 배열의 끝에있게됩니다. 하나의 하위 배열은 항상 비어 있고 다른 하위 배열에는 n-1 개의 요소가 포함됩니다. 따라서이 하위 배열에서만 빠른 정렬을 호출하십시오.
    그러나 분산 된 축의 경우 빠른 정렬 알고리즘의 성능이 더 좋습니다.
  • 최상의 복잡성 [large Ω] : O (n * log n)
    최상의 복잡성은 축 요소가 항상 중간 요소이거나 중간 요소에 가까울 때입니다.
  • 평균 상황 복잡도 [big θ] : O (n * logn)
    위의 두 상황이 발생하지 않는 경우 평균 상황 복잡도입니다.

    공간 복잡성
    빠른 정렬 의 공간 복잡성 은 O (log n)입니다.

빠른 정렬 알고리즘 적용

    다음 상황이 발생하면 빠른 정렬 알고리즘을 사용하십시오.

  • 재귀에 좋은 프로그래밍 언어
  • 시간 복잡성이 중요합니다
  • 공간 복잡성이 중요합니다
참조 문서

[1] Parewa Labs Pvt. Ltd. Quicksort Algorithm [EB / OL] .https : //www.programiz.com/dsa/quick-sort,2020-01-01.

추천

출처blog.csdn.net/zsx0728/article/details/114836295