Java에서 카운팅 정렬 알고리즘 구현

게시 됨: 2023-01-30
Java에서 카운팅 정렬 알고리즘 구현

카운팅 정렬 알고리즘이란?

small ranges of integers 에 효율적인 정렬 알고리즘인 카운팅 정렬입니다. 입력 배열에서 각 값의 발생 횟수를 계산한 다음 해당 정보를 사용하여 각 값을 출력 배열의 올바른 위치에 배치하는 방식으로 작동합니다.

이 알고리즘의 시간 복잡도는 O(n+k) 입니다. 여기서 n은 입력 배열의 크기이고 k는 정수 범위입니다.

CrunchifyCountingSortAlgo.java

다음은 Java에서 Counting Sort를 완벽하게 구현한 것입니다. 원하는 IDEA에 복사하고 실행하십시오.

 패키지 crunchify.com.java.tutorials;

import java.util.Arrays;

/**
 * @author Crunchify.com
 * 프로그램: Java에서 카운팅 정렬 알고리즘을 구현하는 방법은 무엇입니까?
 * 카운팅 정렬은 배열의 요소를 정렬하는 정렬 알고리즘입니다. 
 * 배열에서 각 고유 요소의 발생 수를 계산하여.
 */

공개 클래스 CrunchifyCountingSortAlgo {

    공개 정적 무효 메인(문자열[] 인수) {

        // 10개 요소의 정수 배열
        int[] crunchifyArray = {9, 3, 6, 6, 1, 12, 32, 29, 2, 9, 3};

        crunchifyPrint("원본 배열: " + Arrays.toString(crunchifyArray));
        crunchifyPrint("\n");

        CrunchifyCountingSortAlgo crunchify = new CrunchifyCountingSortAlgo();
        crunchify.crunchifyCountingSortAlgorithm(crunchifyArray);

        crunchifyPrint("\n");
        crunchifyPrint("Crunchify 계산 정렬 알고리즘의 결과: " + Arrays.toString(crunchifyArray));
    }

    개인 정적 무효 crunchifyPrint(문자열 s) {

        System.out.println(s);
    }


    /**
     * 작성자: App Shah (Crunchify.com)
     *
     * 계수 정렬 논리:
     * 작은 범위의 정수에 효율적인 정렬 알고리즘인 카운팅 정렬을 구현한 것입니다.
     * 입력 배열에서 각 값의 발생 횟수를 세는 방식으로 작동합니다.
     * 그런 다음 해당 정보를 사용하여 각 값을 출력 배열의 올바른 위치에 배치합니다.
     * 이 알고리즘의 시간복잡도는 O(n+k),
     * 여기서 n은 입력 배열의 크기이고 k는 정수의 범위입니다.
     */


    공개 정적 int[] crunchifyCountingSortAlgorithm(int[] crunchifyArray) {

        // getAsInt(): 값이 있으면 값을 반환하고 그렇지 않으면 NoSuchElementException을 발생시킵니다.
        int crunchifyMax = Arrays.stream(crunchifyArray).max().getAsInt();
        int[] crunchifyCount = 새로운 int[crunchifyMax + 1];

        // crunchifyCount 입력 배열에서 각 값의 발생 횟수
        for (int i = 0; i < crunchifyArray.length; i++) {
            crunchifyCount[crunchifyArray[i]]++;
            crunchifyPrint("crunchifyCount[" + crunchifyArray[i]에 1 추가 
                    + "], crunchifyCount 배열은 이제: " + Arrays.toString(crunchifyCount));
        }

        crunchifyPrint("\n");

        정수 k = 0;
        for (int i = 0; i <= crunchifyMax; i++) {
            for (int j = 0; j < crunchifyCount[i]; j++) {
                crunchifyArray[k++] = i;
                crunchifyPrint("위치 " + (k - 1)에 " + i + " 추가 
                        + " 출력 배열에서 출력 배열은 이제 " + Arrays.toString(crunchifyArray));
            }
        }

        crunchifyArray 반환;
    }

}

IntelliJ IDEA 또는 Eclipse IDE에서 Java 애플리케이션으로 위의 프로그램을 실행하면 아래와 같은 결과가 나타납니다.

IntelliJ IDEA 콘솔 결과

 원래 배열: [9, 3, 6, 6, 1, 12, 32, 29, 2, 9, 3]


crunchifyCount[9]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[3]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[6]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[6]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 0, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[1]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[12]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
crunchifyCount[32]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
crunchifyCount[29]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]
crunchifyCount[2]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 1, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]
crunchifyCount[9]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]
crunchifyCount[3]에 1을 추가하면 crunchifyCount 배열은 이제 [0, 1, 1, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]


출력 배열의 위치 0에 1을 추가하면 출력 배열은 이제 [1, 3, 6, 6, 1, 12, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 1에 2를 추가하면 출력 배열은 이제 [1, 2, 6, 6, 1, 12, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 2에 3을 추가하면 출력 배열은 이제 [1, 2, 3, 6, 1, 12, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 3에 3을 추가하면 출력 배열은 이제 [1, 2, 3, 3, 1, 12, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 4에 6을 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 12, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 5에 6을 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 32, 29, 2, 9, 3]입니다.
출력 배열의 위치 6에 9를 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 9, 29, 2, 9, 3]입니다.
출력 배열의 위치 7에 9를 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 9, 9, 2, 9, 3]입니다.
출력 배열의 위치 8에 12를 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 9, 9, 12, 9, 3]입니다.
출력 배열의 위치 9에 29를 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 9, 9, 12, 29, 3]입니다.
출력 배열의 위치 10에 32를 추가하면 출력 배열은 이제 [1, 2, 3, 3, 6, 6, 9, 9, 12, 29, 32]입니다.


Crunchify 계산 정렬 알고리즘의 결과: [1, 2, 3, 3, 6, 6, 9, 9, 12, 29, 32]

종료 코드 0으로 프로세스가 완료되었습니다. 
Java에서 카운팅 정렬 알고리즘 구현 - IntelliJ IDEA 결과

Counting Sort Algorithm Java 프로그램 위에서 실행되는 문제에 직면하면 알려주세요.