본문 바로가기

Algorithm and Data Structure

Counting Sort

 

index table의 의미

현재 값이 들어가야할 sorted배열의 인덱스 값을 의미한다.

 

index table 구성 후 알고리즘

마지막 인덱스부터 왼쪽으로 이동하는 포인터를 이용하여

해당 값을 인덱스로 하여 index table에서 sorted 배열에 입력할 인덱스 위치를 가져온다.

그 후에 해당 index table의 값을 1 감소 시킨다.

 

 

 

#include <bits/stdc++.h>



void CountingSort(std::vector<int> & arr) {

    int max = INT_MIN;
    int min = INT_MAX;
    for (int e : arr) {
        max = std::max(max, e);
        min = std::min(min, e);
    }
    int k = max - min + 1;
    
    std::vector<int> sorted(arr.size());
    std::vector<int> count(k);
    std::vector<int> acc_count(k);
    std::vector<int> end_locs(k);

    for (int e : arr) {
        ++count[e- min];
    }
    int acc = 0;

    for (int i = 0; i < k; ++i) {
        acc += count[i];
        acc_count[i] = acc;
    }

    for (int i = 0; i < k; ++i) {
        end_locs[i] = acc_count[i] - 1;
    }
    
    for (int i = arr.size() - 1; i >= 0; --i) {
        int num = arr[i];
        int idx = num - min;
        int end_loc = end_locs[idx];
        sorted[end_loc] = num;
        --end_locs[idx];
    }

    for (int i = 0; i < arr.size(); ++i) {
        arr[i] = sorted[i];
    }
}




void printArr(std::vector<int> arr){
    for (auto ele : arr) {
        std::cout << ele << " ";
    }
    std::cout << "\n";
}



int main(int argc, char** argv) {

    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::vector<int> arr = {3, 5, 7, 9, 4, 2};
    std::cout << "before : ";
    printArr(arr);
    
    CountingSort(arr);

    std::cout << "after  : ";
    printArr(arr);

    arr = {3, 0, 5, 1, 0, 5};
    std::cout << "\n";
    std::cout << "before : ";
    printArr(arr);
    
    CountingSort(arr);

    std::cout << "after  : ";
    printArr(arr);
	return 0;
}

 

 

정리

시간복잡도 O(n + k)   k = 최댓값 - 최솟값 + 1

공간복잡도 max(O(n), O(k))

Stable : O

 

'Algorithm and Data Structure' 카테고리의 다른 글

C언어 이중연결리스트(Doubly linked list) 구현  (0) 2023.12.18
Radix Sort  (0) 2023.12.17
Heap Sort  (0) 2023.12.17
Quick Sort  (1) 2023.12.17
Merge Sort  (1) 2023.12.17