본문 바로가기
Algorithm

[Algorithm] Quick Selection

by Saerong2 2020. 10. 23.

 

 

 

소스코드

#include <cstdio>
#include <algorithm>

using namespace std;

const int MX = 5000001;

int partition(int* a, int left, int right)
{
    int pivot_idx = right;
    int pivot_val = a[pivot_idx];
    
    swap(a[pivot_idx], a[right]);
    
    int cnt = left;
    for (int i = left; i < right; ++i) {
        if (a[i] <= pivot_val) { //important
            swap(a[i], a[cnt++]);
        }
    }
    swap(a[right], a[cnt]);
    return cnt;
}

// return kth smallest number
int kth_elem(int* a, int l, int r, int k)
{
    int pivot = partition(a, l, r);
    if (pivot == k) {
        return a[pivot];
    }
    else if (pivot < k) {
        return kth_elem(a, pivot + 1, r, k);
    }
    else {
        return kth_elem(a, l, pivot - 1, k);
    }
}

int main()
{
    int n, k, a[MX];
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; ++i)
        scanf("%d", &a[i]);

    printf("%d\n", kth_elem(a, 0, n - 1, k - 1));
    return 0;
}

 

 

 

 

 

공부한 것을 정리하기 위한 기록입니다.

틀린 부분이 있다면 부드럽게 알려주세요.

'Algorithm' 카테고리의 다른 글

[Algorithm] Heap Sort  (0) 2020.10.26
[Algorithm] Merge Sort  (0) 2020.10.24
[Algorithm] Quick Sort  (0) 2020.10.24
[Algorithm] Master Theorem (feat. Quick Selection)  (0) 2020.10.23

댓글