ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Counting sort
    ps 2024. 8. 26. 10:40

    $$ O(n) $$

     

    입력 값의 범위가 작은 경우 유용하게 쓰이는 알고리즘

     

    1. arr1 에서 각 값이 등장하는 횟수를 count

    for(int i=0; i<n; i++)			// 입력 개수 n
    	count[arr1[i]]++;

     

    2. count 한 값을 누적합 계산

    for(int i=1; i<max; i++)		// 입력 값의 최댓값 max
    	count[i] += count[i-1];

     

    3. arr2[누적합-1]에 arr1 값 input

    for(int i=n; i>0; i++)
    	arr2[--count[arr[i]]] = arr1[i]

     

    arr1 : 기존 데이터

    arr2 : 정렬된 데이터

     

    관련 문제

    BOJ 10989 수 정렬하기 3

    입력 범위$$ 1  \leq n  \leq 10,000,000 $$ $$ 1 \leq num  \leq 10,000 $$

    #include <stdio.h>
    
    int main()
    {
        int n, num;
        int count[10000] = {0};
    
        scanf("%d", &n);
    
        for(int i=0; i<n; i++){
            scanf("%d", &num);
            count[num-1]++;
        }
        for(int i=0; i<10000; i++){
            for(int j=0; j<count[i]; j++)
                printf("%d\n", i+1);
        }
    }

     

     

    관련 문제2

    BOJ 1427 소트인사이드

     

    숫자는 0~9 (10개)이므로 counting sort를 사용하기 적합하다고 판단

    #include <stdio.h>
    
    // counting sort
    
    int main()
    {
        int n, digit = 0;
        int count[10] = {0};
        int result[10];
    
        scanf("%d", &n);
        int tmp = n;
    
        while(tmp)
        {
            count[tmp%10]++;
            tmp /= 10;
            digit++;
        }
        for(int i=0; i<9; i++)
            count[i+1] += count[i];
        for(int i=0; i<digit; i++){
            result[--count[n%10]] = n%10;
            n /= 10;
        }
        for(int i=digit-1; i>=0; i--){
            printf("%d", result[i]);
        }
    }

    'ps' 카테고리의 다른 글

    qsort() in C  (0) 2024.08.28
    시간복잡도2 BOJ 24267  (0) 2024.08.19
    시간복잡도 BOJ 24265  (0) 2024.08.19
    시간초과 feat.O(1)  (0) 2024.08.08
    strlen() in for loop  (0) 2024.07.29

    댓글

Designed by Tistory.