์ •๋ ฌ

9/8/2025

๋ถ„๋ฅ˜

๋น„๊ต ํšŸ์ˆ˜์— ์˜ํ•ด

  • ๋น„๊ต์— ๊ธฐ๋ฐ˜ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(nlogn)O(nlogn), ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n2)O(n^2).
    ๊ตํ™˜Swap ํšŸ์ˆ˜์— ์˜ํ•ด
    ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ์˜ํ•ด
  • ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ œ์ž๋ฆฌ(in-place)์—์„œ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ์ ์œผ๋กœ ์ €์žฅํ•  ๋ณด์กฐ ๊ณต๊ฐ„์„ ์œ„ํ•ด O(1)์ด๋‚˜ O(logn) ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    ์žฌ๊ท€์— ์˜ํ•ด
    ์•ˆ์ •์„ฑ์— ์˜ํ•ด
    ์ ์‘์„ฑAdaptability ์— ์˜ํ•ด
  • ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์„ ์ •๋ ฌpresortedness ์— ์˜ํ•ด ๋ณต์žก๋„๊ฐ€ ๋ฐ”๋€๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค

๋ฒ„๋ธ” ์ •๋ ฌ Bubble Sort

void BubbleSort(int arr[], int len) {
  int i, j, tmp;
  for (i = 0; i < len - 1; ++i) {
    for (j = 0; j < len - i - 1; ++j) {
      if (arr[j] > arr[j + 1]) {
        tmp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = tmp;
      }
    }
  }
}
void BubbleSort(int arr[],int len){
	int pass, i, temp, swappted = 1;
	for(pass=len-1;pass>=0 && swapped;pass--){
		swapped = 0;
		for(i=0;i<pass;i++){
			if(arr[i] > arr[i+1]){
				temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
				swapped = 1;
			}
		}
	}
}

์•„๋ž˜์˜ ๋ฒ„๋ธ” ์ •๋ ฌ์€ ์กฐ๊ธฐ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์„œ ์•ฝ๊ฐ„์€ ์ตœ์ ํ™” ๋œ ๋ฒ„์ „.

์„ ํƒ ์ •๋ ฌ Selection Sort

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
      
        int min_idx = i;
        
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
              
                min_idx = j;
            }
        }
        
        int temp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = temp;
    }
}

๋ฒ„๋ธ”์ •๋ ฌ๊ณผ ๋‹ฌ๋ฆฌ ์กฐ๊ธฐ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.

์ˆ˜์—… ์™ธ ๋‚ด์šฉ

์ˆ˜์—…์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ ๊ถ๊ธˆํ•ด์„œ ์ƒ๊ฐํ•ด ๋ณธ ๊ฒƒ๋“ค์ด๋‹ค.

๋ฒ„๋ธ” ์ •๋ ฌ๊ณผ์˜ ๋น„๊ต

์กฐ๊ธฐ ์ข…๋ฃŒ ๊ฐ€๋Šฅ์„ฑ์˜ ์ฐจ์ด

๋ฒ„๋ธ” ์ •๋ ฌ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ :
๋ฒ„๋ธ” ์ •๋ ฌ์€ ์ธ์ ‘ํ•œ ์›์†Œ๋“ค๋ผ๋ฆฌ ๋น„๊ตํ•˜์—ฌ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. i ์ˆœํšŒ๋งˆ๋‹ค j ์ˆœํšŒ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์ •๋ ฌ๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ๋ฒ„๋ธ” ์ •๋ ฌ์—์„œ๋Š” j ์ˆœํšŒ ๋™์•ˆ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ธ์ ‘ํ•œ ๋‘ ์š”์†Œ ๊ตํ™˜์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
ํ•ต์‹ฌ์€ j ์ˆœํšŒ ๋•Œ ํ•œ ๋ฒˆ๋„ ๊ตํ™˜์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด ์ด๋ฏธ ํ•ด๋‹น ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ถˆ๋ฆฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ ํƒ ์ •๋ ฌ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ๊ฐ€ ์–ด๋ ค์šด ์ด์œ :
์„ ํƒ ์ •๋ ฌ์€ ๊ฐ ์ˆœํšŒ์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์€ ํ›„ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๊ตํ™˜ํ•œ๋‹ค. ํ˜„์žฌ ์œ„์น˜์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์ด ์ด๋ฏธ ์žˆ์–ด๋„ ์ „์ฒด ๋ฐฐ์—ด์„ ์Šค์บ”ํ•ด์•ผ๋งŒ ๊ทธ๊ฒƒ์ด ์ตœ์†Ÿ๊ฐ’์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ฑ๋Šฅ ๋น„๊ต

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฒ„๋ธ” ์ •๋ ฌ์ด ์„ ํƒ ์ •๋ ฌ๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ์šฐ์›”ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ผ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๋ฒ„๋ธ” ์ •๋ ฌ์—์„œ๋Š” ์žฆ์€ ๊ตํ™˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ตํ™˜ ํšŸ์ˆ˜ ์ฐจ์ด:

  • ์„ ํƒ ์ •๋ ฌ: O(n) - ๊ฐ ์ˆœํšŒ๋งˆ๋‹ค ์ตœ๋Œ€ 1๋ฒˆ์˜ ๊ตํ™˜
  • ๋ฒ„๋ธ” ์ •๋ ฌ: O(nยฒ) - ์ธ์ ‘ ์š”์†Œ๋“ค์˜ ๋นˆ๋ฒˆํ•œ ๊ตํ™˜
    ๊ตํ™˜ ์—ฐ์‚ฐ์€ ๋น„๊ต ์—ฐ์‚ฐ๋ณด๋‹ค ๋น„์šฉ์ด ํฌ๋ฏ€๋กœ, ์ ์€ ๊ตํ™˜ ํšŸ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์„ ํƒ ์ •๋ ฌ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ด๋‹ค.

์กฐ๊ธฐ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?

function selectionSort(arr) {
    for (let i = 0; i < arr.length; i++) {      
        let min_idx = i;
        let check = true;
        
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
            if(arr[j]>arr[j+1]){
	            check = false;
            }
        }
        
        if(min_idx === i && check){
	        break;
        }else{
	        let temp = arr[i];
	        arr[i] = arr[min_idx];
	        arr[min_idx] = temp;
        }
    }
}
๋™์ž‘ ์˜ˆ์‹œ

[5, 3, 1, 7, 9] ๋ฐฐ์—ด ์ •๋ ฌ:

  1. ์ฒซ ๋ฒˆ์งธ ์ˆœํšŒ: 1์„ ์ฐพ์•„์„œ ๋งจ ์•ž์œผ๋กœ โ†’ [1, 3, 5, 7, 9]
  2. ๋‘ ๋ฒˆ์งธ ์ˆœํšŒ: 3์ด ์ด๋ฏธ ์ตœ์†Ÿ๊ฐ’์ด๊ณ , ๋‚˜๋จธ์ง€๊ฐ€ ์ •๋ ฌ๋จ์„ ํ™•์ธ โ†’ ์กฐ๊ธฐ ์ข…๋ฃŒ
ํ•œ๊ณ„์ 

์ถ”๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ:

  • ๊ธฐ์กด ์„ ํƒ ์ •๋ ฌ: ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ ์—ฐ์‚ฐ๋งŒ ์ˆ˜ํ–‰
  • ๊ฐœ์„ ๋œ ๋ฒ„์ „: ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ + ์ •๋ ฌ ์ƒํƒœ ํ™•์ธ ์—ฐ์‚ฐ
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: ๋น„๊ต ์—ฐ์‚ฐ์ด ์•ฝ 2๋ฐฐ๋กœ ์ฆ๊ฐ€

์ตœ์•…์˜ ๊ฒฝ์šฐ๋“ค:

  1. ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด: [9, 7, 5, 3, 1]
    • ๋งค๋ฒˆ ๊ตํ™˜์ด ํ•„์š”ํ•˜๊ณ , ์ •๋ ฌ ์ƒํƒœ ํ™•์ธ๋„ ํ•ญ์ƒ ์‹คํŒจ
  2. ๊ฑฐ์˜ ์—ญ์ˆœ์ธ ๋ฐฐ์—ด: [8, 7, 6, 5, 1, 2, 3, 4]
    • ์ค‘๊ฐ„๊นŒ์ง€ ์ •๋ ฌ ํ™•์ธ์ด ๊ณ„์† ์‹คํŒจ
  3. ๋ฌด์ž‘์œ„ ๋ฐฐ์—ด: ์ •๋ ฌ ์ƒํƒœ๊ฐ€ ํ›„๋ฐ˜๋ถ€์—์„œ์•ผ ๋‹ฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ

๊ฒฐ๋ก 

์„ ํƒ ์ •๋ ฌ์˜ ์กฐ๊ธฐ ์ข…๋ฃŒ ์ตœ์ ํ™”๋Š” ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋‚˜ ๋ถ€๋ถ„์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ๋งŒ ํšจ๊ณผ์ ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€ ๋น„๊ต ์—ฐ์‚ฐ์œผ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด, ์‹ค์šฉ์„ฑ์€ ์ œํ•œ์ .

์‚ฝ์ž… ์ •๋ ฌ Insertion Sort

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; ++i) {
        int key = arr[i];
        int j = i - 1;

        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        
        arr[j + 1] = key;
    }
}

์žฅ์  :

  • ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„
  • ์ž‘์€ ๋ฐ์ดํ„ฐ์— ํšจ์œจ์ 
  • ์ ์‘์  : ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ด๋น„ ์ •๋ ฌ๋˜์–ด์žˆ๋‹ค๋ฉด, ์‚ฝ์ž… ์ •๋ ฌ์€ d๊ฐ€ ๋ฐ˜๋ฒˆ์˜ ํšŸ์ˆ˜์ผ ๋•Œ O(n+d)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ์˜จ๋ผ์ธ : ์‚ฝ์ž… ์ •๋ ฌ์€ ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด์„œ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘ํ•ฉ ์ •๋ ฌ Merge Sort

Divide-and-Conquere์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ.

#include <stdio.h>
#include <stdlib.h>

// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
void merge(int arr[], int l, int m, int r){
    
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;

    // Create temp arrays
    int L[n1], R[n2];

    // Copy data to temp arrays L[] and R[]
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    // Merge the temp arrays back into arr[l..r
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        }
        else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // Copy the remaining elements of L[],
    // if there are any
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    // Copy the remaining elements of R[],
    // if there are any
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

// l is for left index and r is right index of the
// sub-array of arr to be sorted
void mergeSort(int arr[], int l, int r){
    
    if (l < r) {
        int m = l + (r - l) / 2;

        // Sort first and second halves
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);

        merge(arr, l, m, r);
    }
}

// Driver code
int main(){
    
    int arr[] = {38, 27, 43, 10};
    int arr_size = sizeof(arr) / sizeof(arr[0]);

    mergeSort(arr, 0, arr_size - 1);
    int i;
    for (i = 0; i < arr_size; i++)
        printf("%d ", arr[i]);
    printf("\n");
    
    return 0;
}

ํž™ ์ •๋ ฌ Heap Sort

// To heapify a subtree rooted with node i
// which is an index in arr[].
void heapify(int arr[], int n, int i) {

    // Initialize largest as root
    int largest = i; 

    // left index = 2*i + 1
    int l = 2 * i + 1; 

    // right index = 2*i + 2
    int r = 2 * i + 2;

    // If left child is larger than root
    if (l < n && arr[l] > arr[largest]) {
        largest = l;
    }

    // If right child is larger than largest so far
    if (r < n && arr[r] > arr[largest]) {
        largest = r;
    }

    // If largest is not root
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;

        // Recursively heapify the affected sub-tree
        heapify(arr, n, largest);
    }
}

// Main function to do heap sort
void heapSort(int arr[], int n) {

    // Build heap (rearrange array)
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // One by one extract an element from heap
    for (int i = n - 1; i > 0; i--) {

        // Move current root to end
        int temp = arr[0]; 
        arr[0] = arr[i];
        arr[i] = temp;

        // Call max heapify on the reduced heap
        heapify(arr, i, 0);
    }
}

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

// Driver's code
int main() {
    int arr[] = {9, 4, 3, 8, 10, 2, 5}; 
    int n = sizeof(arr) / sizeof(arr[0]);

    heapSort(arr, n);

    printf("Sorted array is \n");
    printArray(arr, n);
    return 0;
}

๊ธฐ๋ณธ ๊ฐœ๋…

ํž™ ์ •๋ ฌ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๋งŒ๋“ค๊ณ , ๊ฑฐ๊ธฐ์„œ ๋‹ค์‹œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

ํž™ ์„ ํƒ ๊ธฐ์ค€

  • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ: max heap ์‚ฌ์šฉ
  • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ: min heap ์‚ฌ์šฉ

์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ(์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’)๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๋งจ ๋’ค๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„

์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์„ฑ

heapSort() ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ์ฃผ์š” ๊ณผ์ •์œผ๋กœ ๋‚˜๋‰œ๋‹ค:

1๋‹จ๊ณ„: ํž™ ๊ตฌ์„ฑ (Build Heap)

  • ๊ณผ์ •: ๋ฌด์ž‘์œ„ ๋ฐฐ์—ด์„ max heap์œผ๋กœ ๋ณ€ํ™˜
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
  • ์„ค๋ช…: ๋ฐฐ์—ด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ๊ฑฐ์˜ n์— ๊ทผ์ ‘ํ•˜๋Š” ํšŸ์ˆ˜์˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

2๋‹จ๊ณ„: ์ •๋ ฌ ์ˆ˜ํ–‰ (Sorting)

  • ๊ณผ์ •: ํž™์—์„œ ์ฐจ๋ก€๋Œ€๋กœ ์ตœ๋Œ“๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ์ •๋ ฌ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  • ์„ค๋ช…:
    • ๊ฐ ๋…ธ๋“œ n๊ฐœ์— ๋Œ€ํ•ด heapify ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰
    • heapify ์ž์ฒด๋Š” O(log n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ
    • ์ด๋ฅผ n๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ O(n log n)

์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณ„์‚ฐ

O(n) + O(n log n) = O(n log n)

ํž™ ๊ตฌ์„ฑ ๋‹จ๊ณ„์˜ O(n)์€ ์ •๋ ฌ ๋‹จ๊ณ„์˜ O(n log n)์— ํก์ˆ˜๋˜์–ด ์ „์ฒด์ ์œผ๋กœ O(n log n) ์ด ๋œ๋‹ค.

ํ•ต์‹ฌ ํฌ์ธํŠธ

  1. ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ: ์ตœ์„ , ํ‰๊ท , ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋‘ O(n log n)
  2. ์ œ์ž๋ฆฌ ์ •๋ ฌ: ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Œ (O(1))
  3. ๋น„์•ˆ์ • ์ •๋ ฌ: ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ๋“ค์˜ ์ƒ๋Œ€์  ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์Œ

ํ€ต ์ •๋ ฌ Quick Sort

๋ณ‘ํ•ฉ์ •๋ ฌ๊ณผ ๋น„์Šทํ•˜๋‹ค, ํ€ต ์ •๋ ฌ๋„ Divide-Conquer ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ˆ์‹œ.
Divide : ๋ฐฐ์—ด์„ ํŠน์ • ์ธ๋ฑ์Šค q๋ฅผ ๊ธฐ์ค€์œผ๋กœ [low ... q-1]๊ณผ [q+1 ... high]๋กœ ๋‚˜๋‰œ๋‹ค.
Conquer : ์œ„์˜ ๋‘ ๋ถ€์† ๋ฐฐ์—ด๋“ค์—์„œ ๋‹ค์‹œ ํ€ต ์ •๋ ฌ์„ ์žฌ๊ท€ ํ˜ธ์ถœ

  1. ๋ฐฐ์—ด ์•ˆ์˜ ํ•ญ๋ชฉ์ด 1๊ฐœ ์ดํ•˜๋ผ๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. ๋ฐฐ์—ด ์•ˆ์˜ ํ•œ ํ•ญ๋ชฉ์„ Pivot์œผ๋กœ ์„ ํƒํ•œ๋‹ค. (๋ณดํ†ต ๋ฐฐ์—ด์˜ ์ œ์ผ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ํ•ญ๋ชฉ)
  3. ๋ฐฐ์—ด์„ pivot๋ณด๋‹ค ์ž‘์€ ํ•ญ๋ชฉ๋“ค๊ณผ ํฐ ํ•ญ๋ชฉ์ธ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ๋‚˜๋ˆˆ๋‹ค.
  4. ์›๋ณธ ๋ฐฐ์—ด์˜ ๋‘ ๋ฐ˜์ชฝ์— ๋Œ€ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.
// partition function
int partition(int arr[], int low, int high) {
    
    // Choose the pivot
    int pivot = arr[high];
    
    // Index of smaller element and indicates 
    // the right position of pivot found so far
    int i = low - 1;

    // Traverse arr[low..high] and move all smaller
    // elements to the left side. Elements from low to 
    // i are smaller after every iteration
    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    
    // Move pivot after smaller elements and
    // return its position
    swap(&arr[i + 1], &arr[high]);  
    return i + 1;
}

// The QuickSort function implementation
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        
        // pi is the partition return index of pivot
        int pi = partition(arr, low, high);

        // recursion calls for smaller elements
        // and greater or equals elements
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

ํ€ต ์ •๋ ฌ์˜ ๋ฌธ์ œ๋Š” ๊ณ„์†ํ•ด์„œ ํ”ผ๋ฒ—์„ ์ตœ๋Œ€๊ฐ’ ํ˜น์€ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์žก์•„์„œ ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n2)O(n^2)๋ผ๋Š” ๊ฒƒ.